Specification同时实现模糊查询、排序、分页
package org.springframework.data.jpa.repository;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> var1);
List<T> findAll(Specification<T> var1);
Page<T> findAll(Specification<T> var1, Pageable var2);
List<T> findAll(Specification<T> var1, Sort var2);
long count(Specification<T> var1);
}
- 我们会发现直接提供的方法不能同时直接实现where、orderBy、Page三者
- 但是我们可以通过对 public Predicate toPredicate(){};中的CriteriaQuery<?> criteriaQuery进行利用即可,具体的操作情况如下:
//实现可以多种查询方式结合:模糊搜索,排序,分页
@Test
public void testFindCustomerWithSort2() {
Page<Customer> page = customerDao.findAll(new Specification<Customer>() {
@Override
public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Predicate predicate1 = criteriaBuilder.like(root.get("custName"), "%未来%");
Predicate predicate = criteriaQuery.where(predicate1).orderBy(criteriaBuilder.asc(root.get("custId"))).getRestriction();
return predicate;
}
}, new PageRequest(0, 10));
System.out.println(page.getTotalElements());
System.out.println(page.getTotalPages());
List<Customer> list = page.getContent();
for (Customer customer : list) {
System.out.println(customer);
}
}