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