Specification同时实现模糊查询、排序、分页

686 阅读1分钟

Specification同时实现模糊查询、排序、分页

以下为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);
        }
    }

更多精彩,尽在微信公众号:ITCBL