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
