JpaSpecificationExecutor
- 不屬於Repository體系,實現一組JPA Criteria查詢相關的方法
- Specification:封裝JPA Criteria查詢條件,通常使用匿名內部類的方法來創建改接口的對象
/**
* 目標: 實現帶查詢條件的分頁. id > 5 的條件
*
* 調用 JpaSpecificationExecutor 的 Page<T> findAll(Specification<T> spec, Pageable pageable);
* Specification: 封裝了 JPA Criteria 查詢的查詢條件
* Pageable: 封裝了請求分頁的信息: 例如 pageNo, pageSize, Sort
*/
@Test
public void testJpaSpecificationExecutor(){
int pageNo = 3 - 1;
int pageSize = 5;
PageRequest pageable = new PageRequest(pageNo, pageSize);
Specification<Person> specification = new Specification<Person>() {
/**
* @param *root: 代表查詢的實體類.
* @param query: 可以從中可到 Root 對象, 即告知 JPA Criteria 查詢要查詢哪一個實體類. 還可以
* 來添加查詢條件, 還可以結合 EntityManager 對象得到最終查詢的 TypedQuery 對象.
* @param *cb: CriteriaBuilder 對象. 用於創建 Criteria 相關對象的工廠. 當然可以從中獲取到 Predicate 對象
* @return: *Predicate 類型, 代表一個查詢條件.
*/
@Override
public Predicate toPredicate(Root<Person> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
Path path = root.get("id");
Predicate predicate = cb.gt(path, 5);
return predicate;
}
};
Page<Person> page = personRepsotory.findAll(specification, pageable);
System.out.println("總記錄數: " + page.getTotalElements());
System.out.println("當前第幾頁: " + (page.getNumber() + 1));
System.out.println("總頁數: " + page.getTotalPages());
System.out.println("當前頁面的 List: " + page.getContent());
System.out.println("當前頁面的記錄數: " + page.getNumberOfElements());
}