欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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. 后来又遇到一个需求,根据一个字段的某个值来排序,没搞定,再研究下,有大神看到了,希望可以指点下,先谢为敬…

以上为手敲,如有错误请指正!