1、Specifications动态查询
-
JpaSpecificationExecutor 方法列表
T findOne(Specification<T> spec); //查询单个对象 List<T> findAll(Specification<T> spec); //查询列表 //查询全部,分页 //pageable:分页参数 //返回值:分页pageBean(page:是springdatajpa提供的) Page<T> findAll(Specification<T> spec, Pageable pageable); //查询列表 //Sort:排序参数 List<T> findAll(Specification<T> spec, Sort sort); long count(Specification<T> spec);//统计查询
-
Specification :查询条件
自定义我们自己的Specification实现类
实现
//root:查询的根对象(查询的任何属性都可以从根对象中获取)
//CriteriaQuery:顶层查询对象,自定义查询方式(了解:一般不用)
//CriteriaBuilder:查询的构造器,封装了很多的查询条件
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb); //封装查询条件
public PageResult<Post> findByClassify(Integer classifyId, Integer matterId, Integer page, Integer rows) {
//自定义查询条件
Specification<Post> spec = new Specification<Post>() {
@Override
public Predicate toPredicate(Root<Post> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> list = new ArrayList<>();
//根据属性名获取查询对象的属性
//Path<Reply> path = root.get("nameId");
//相当于 where receiverName = "Veggie", CriteriaBuilder接口中还有很多查询条件,建议看源码
//Predicate equal = criteriaBuilder.equal(path, userId);
list.add(criteriaBuilder.equal(root.get("classifyId"), classifyId));
list.add(criteriaBuilder.equal(root.get("matterId"), matterId));
return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
}
};
Page<Post> postPage = postRepository.findAll(spec, PageRequest.of(page, rows));
return new PageResult<>(postPage.getTotalElements(), postPage.getTotalPages(), postPage.getContent());
}
网友评论