JPA多条件复杂查询时,使用Predicate复杂查询多字段排序的实现,这种是不分页的排序查询
public List<A> getData(Condition condition){
//condition是查询条件
return ADao.findAll((Specification<A>) (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("A实体里的属性"), condition.get属性()));
query.where(predicates.toArray(new Predicate[predicates.size()]));
//按照多字段排序时,要按下列这样写
List<Order> list = new ArrayList<>();
list.add(cb.desc(root.get("A实体里的属性a").as(Long.class)));
list.add(cb.desc(root.get("A实体里的属性b").as(Long.class)));
list.add(cb.desc(root.get("A实体里的属性c").as(Long.class)));
query.orderBy(list);
return query.getRestriction();
});
}
要注意的一点是,多字段排序时,要用List<Order>去存储排序条件,
不能如下这样写!!!
query.where(predicates.toArray(new Predicate[predicates.size()]));
query.orderBy(cb.desc(root.get("A实体里的属性a").as(Long.class)));
query.orderBy(cb.desc(root.get("A实体里的属性b").as(Long.class)));
query.orderBy(cb.desc(root.get("A实体里的属性c").as(Long.class)));
return query.getRestriction();
还有分页的排序查询:
AController.java:
Sort sort = new Sort(Sort.Direction.DESC, "A实体类中的属性a","A实体类中的属性b","A实体类中的属性c");
Pageable page = PageRequest.of(Integer.valueOf(pageIndex)-1,Integer.valueOf(pageSize),sort);
Page<A> pageData = AService.getDataByPage(condition, page);
AService.java
public Page<A> getDataByPage(ImnCondition condiction, Pageable pageable){
return aDao.findAll((Specification<A>) (root, query, cb) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get("A实体里的属性"), condition.get属性()));
return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();
},pageable);
}