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);