Spring Boot 3 與 Hibernate JPA 教學(五) 分頁與排序

Spring Boot 3 使用 JPA 進行資料查詢時,當有多筆資料要呈現,通常會使用到分頁的機制。

使用分頁時,會使用到三個相關的物件:

  • Page
  • PageRequest
  • Sort

以上物件都是屬於 org.springframework.data.domain

JPA 中的 Page

Page 是用來存放查詢的結果,類似 List。

JPA 中的 PageRequest

PageRequest 是用來存來分頁的資訊,第幾頁,一頁幾筆。

JPA 中的 Sort

指定排序的欄位與方法

分頁的程式

直接利用 Dao 中的 findAll

修改 MyBookAction.java

@GetMapping("queryPage")
	public Map queryPage() {
		Map rs = new HashMap();
		
		Page<MyBook> pageResult = myBookDao.findAll(
                PageRequest.of(1,  // 查詢的頁數,從0起算
                                2, // 查詢的每頁筆數
                                Sort.by("price").descending())); // 依price欄位降冪排序
        
        pageResult.getNumberOfElements(); // 本頁筆數
        pageResult.getSize();             // 每頁筆數 
        pageResult.getTotalElements();    // 全部筆數
        pageResult.getTotalPages();       // 全部頁數
        
        List<MyBook> list =  pageResult.getContent();
		List<MyBookVo> listVo = new ArrayList<>();
		for(MyBook book:list) {
			MyBookVo vo = new MyBookVo();
			BeanUtils.copyProperties(book, vo);//複製資廖
			listVo.add(vo);
		}
		
		rs.put("success", true);
		rs.put("book", listVo);
		return rs;
	}

在瀏覽器上執行: http://localhost:8080/MyBook/queryPage

分頁的程式搭配原生的SQL

在 MyBookDao.java 增加 method

 @Query(
            nativeQuery = true,
            value = """
                SELECT *
                FROM `mybook`
            """
    )
    Page<MyBook> findMyOwn(PageRequest pageRequest);

修改 MyBookAction.java 增加 method

	@GetMapping("queryMyOwn")
	public Map queryMyOwn() {
		Map rs = new HashMap();
		
		Page<MyBook> pageResult = myBookDao.findMyOwn(
                PageRequest.of( 1,  // 查詢的頁數,從0起算
                                2, // 查詢的每頁筆數
                                Sort.by("price").descending())); // 依price欄位降冪排序
        
        pageResult.getNumberOfElements(); // 本頁筆數
        pageResult.getSize();             // 每頁筆數 
        pageResult.getTotalElements();    // 全部筆數
        pageResult.getTotalPages();       // 全部頁數
        
        List<MyBook> list =  pageResult.getContent();
		List<MyBookVo> listVo = new ArrayList<>();
		for(MyBook book:list) {
			MyBookVo vo = new MyBookVo();
			BeanUtils.copyProperties(book, vo);//複製資廖
			listVo.add(vo);
		}
		
		rs.put("success", true);
		rs.put("book", listVo);
		return rs;
	}

在瀏覽器上執行: http://localhost:8080/MyBook/queryMyOwn