Spring Data JPA Specification查询、排序和分页

JPA提供了关键字查询(如findByName),为数据操作提供了便利。同时提供了Specification的准则查询方式,使我们可以更方便的进行复杂的条件查询,包括排序和分页等。新手做点记录备忘。

1.我们自定义的接口类必须实现JpaSpecificationExecutor接口

public interface EducationOrganizationRepository extends CrudRepository<EducationOrganizationDO, Long>,  JpaSpecificationExecutor<EducationOrganizationDO>

2.构建查询所需的参数

2.1先说分页和排序


List<String> sortAscField = new ArrayList<>();
        sortAscField.add("namePy");
        sortAscField.add("grade");
        Sort sort1 = new Sort(Sort.Direction.ASC, sortAscField );
List<String> sortDescField = new ArrayList<>();
        sortDescField.add("name");
        sortDescField.add("sex");
//先按某些字段升序,再按另一些字段降序排序
Sort sort = sort1.and(new Sort(Sort.Direction.DESC, sortDescField));
//构建分页和排序的参数PageRequest
PageRequest pageRequest = new PageRequest(requestVO.getPageNum(), requestVO.getPageSize(), sort);

2.2字段的多条件查询参数Specification<T>

CriteriaBuilder包含的条件构造有很多,如and、or、equal、not、in、notEqual、between等  
 Specification<EducationOrganizationDO> specification = (root,criteriaQuery, criteriaBuilder) -> {
            List<Predicate> predicates = new ArrayList<>();
            //状态为0的数据  equal
            predicates.add(criteriaBuilder.equal(root.get("dataStatus"), 0));
        //id属于某集合  in
predicates.add(criteriaBuilder.in(root.get("higherOffice").get("id")).value(allSubGovs.getItems()));
            
            if (requestVO.getName() != null) {
                    //名字模糊查询 like
                    predicates.add(criteriaBuilder.like(root.get("name"), name));
            }      
//没有not in  可以使用not 和 in 的组合
predicates.add(criteriaBuilder.not(criteriaBuilder.in(root.get("id")).value(schoolIds)));
            return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
        };

3执行查询

        Page<EducationOrganizationDO> pageResult = educationOrganizationRepository.findAll(specification, pageRequest);

猜你喜欢

转载自blog.csdn.net/BIGE_BIGGER/article/details/85326814