在SpringData中實作分頁功能我們需要将接口實作PagingAndSortingRepository這個接口提供了分頁查詢的方法
Page<T> findAll(Pageable pageable); //分頁查詢(含排序功能)
@Test
public void Pagination() {
int pageIndex = 1;// 前台傳過來的目前頁
int pageSize = 5;// 每頁需要的記錄數
/**
* 不帶排序寫法: Pageable pageable = new PageRequest(pageIndex, pageSize);
*/
// 按照年齡字段排序
Order order = new Order(Direction.DESC, "age");
Sort sort = new Sort(order);
Pageable pageable = new PageRequest(pageIndex - 1, pageSize, sort);
Page<Student> page = studentService.findAll(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());
for (Student student : page.getContent()) {
System.out.println(student);
}
}
這樣就可以簡單的實作我們的分頁了,但是瞬時間發現這個分頁并不能帶條件啊。
SpringData中給我們提供了一個接口,我們隻需要将我們Dao層接口實作JpaSpecificationExecutor就可以達到帶條件分頁的效果
@Test
public void testJpaSpecificationExecutor(){
int pageIndex = 1;
int pagesize = 0;
PageRequest pagerequest = new PageRequest(pageIndex - 1, pagesize);
Specification<Student> specification = new Specification<Student>() {
@Override
public Predicate toPredicate(Root<Student> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
/**
* Root<Student>:表示查詢的實體
* CriteriaQuery:可以從中得到root對象,即告知JPA criteria查詢要查詢哪一個實體類。還可以來添加查詢條件。還可以結合EntityManager對象得到最終查詢的TypedQuery對象。
* CriteriaBuilder:用于建立Criteria相關對象的工廠。
*/
//年齡屬性
Path<Integer> path = root.get("age");
Predicate predicate = cb.gt(path, 5);//大于5
return predicate;
}
};
Page<Student> page = studentDao.findAll(specification, pagerequest);
}