Spring data jpa sort多属性排序问题

在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;

你可能感兴趣的:(java)