Spring -Data-Jpa 多条件排序
程序员文章站
2022-03-02 15:40:07
...
简单的常用的就不多说了,这里纪录下项目中用到的几种排序场景
1. 多条件同序排序(全是正序/全是倒序)
Sort sort = isSnapshot ? new Sort(Sort.Direction.DESC, "isTop", "createTime"):new Sort(Sort.Direction.ASC, "state","createTime");
2. 不同顺序多条件排序(有正序有倒叙)
Sort sort = Sort.by(Sort.Order.asc("state"),Sort.Order.desc("createTime"));
//或者
Sort.by("state").ascending().and(Sort.by("createTime").descending())
//或者
List<Sort.Order> orders=new ArrayList<>();
orders.add(new Sort.Order(Sort.Direction.ASC,"state"));
orders.add(new Sort.Order(Sort.Direction.DESC,"createTime"));
Sort sort = Sort.by(orders);
3. 不同参数之间运算结果排序(此处根据两字段之和多条件排序做了简单封装)
public static Specification genResourceSpecification(ResourceShowQueryDto query,Integer resourceId) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> list = new ArrayList<>();
list.add(criteriaBuilder.equal(root.get(TYPE), ResourceTypeEnum.FILE.name()));
if (Objects.nonNull(resourcesId) && resourcesId.size() != 0) {
CriteriaBuilder.In<Object> in = criteriaBuilder.in(root.get(ID));
resourcesId.forEach(id -> in.value(id));
list.add(in);
}
if(query.getOrderBy.equals("hot")){
Expression<Integer> hotSort = criteriaBuilder.sum(root.get(READ_COUNT), root.get(LIKES_COUNT));
criteriaQuery.orderBy(criteriaBuilder.desc(hotSort));
}else{
criteriaQuery.orderBy(criteriaBuilder.desc(root.get(sortRule)));
}
return criteriaBuilder.and(list.toArray(new Predicate[0]));
};
}
4. 后来又遇到一个需求,根据一个字段的某个值来排序,没搞定,再研究下,有大神看到了,希望可以指点下,先谢为敬…
以上为手敲,如有错误请指正!
上一篇: 使用aop管理日志