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

Spring data jpa sort多属性排序问题

程序员文章站 2022-04-25 22:11:17
...

在spring data for jpa 中,存在一个pageable接口,是对查询分页的一个利器。
pageable实现类的构造方法中有个Sort参数,可以按照列属性进行排序。通过查看Sort类的构造方法,我们对Sort这个类进行一下分析,Sort类中存在一下几个构造方法:

1.public Sort(Order… orders);

2.public Sort(List orders);

3.public Sort(String… properties);

4.public Sort(Direction direction, String… properties);

5.public Sort(Direction direction, List properties);

大概这几种构造方法,其中Direction 是用来标识按照列属性升序还是降序排序的。

properties即为列属性。

方法3只是输入列属性,按照默认的排序方式(ASC)

方法4、5只能够实用一种排序方向,我们要排列的多个属性都是升序或都是降序

方法1和2,性质相同,可以实现多个列属性的不同方向排序,例如需要实现一个形如下面的sql:

select * from table where a='a' and b='b' order by c desc,d asc,e desc;

这个Order一定要是import org.springframework.data.domain.Sort.Order;这个包下面的。

然后我们建立三个order分别为如下:

List< Order> orders=new ArrayList< Order>();
Order order2 = new Order(Direction.DESC, "age");
Order order3 = new Order(Direction.ASC, "pgrade");
Order order = new Order(Direction.DESC, "dnum");

那么我们目前的任务就是把这三个order放到list里面然后把list放到sort里面这么简单。不过这里要注意,添加到list中的先后直接关联着排序的优先级,如下:

list.add(order2);
list.add(order3);
list.add(order);
Sort sort1 = new Sort(list);

生成需要的pageable

Pageable pageable= new PageRequest(pageNumber, pageSize, new Sort(orders));

springboot 2.x 使用:

Pageable pageable= PageRequest.of(pageNumber, pageSize, new Sort(orders));

若使用复杂查询JpaSpecificationExecutor,可用:

query.orderBy(criteriaBuilder.desc(root.get("age").as(Integer.class)), criteriaBuilder.desc(root.get("id").as(Integer.class)));

使用此排序规则,如果pageable有sort则会以pageable为准

注:如不分页,可直接使用Sort;