Java关于SpringbootJPA分页及排序
创建Pageable对象
看了⽹上很多博客,都是在⽤ new PageRequest的⽅法创建Pageable对象。可是估计很多同学写了之后才发现原来这个⽅法作者已经标记为过时了;
替代的⽅法是不要new PageRequest,⽽是直接⽤ PageRequest.of这个⽅法根据你的需求选择⼊参;
下⾯贴出对⽐
@Override
@Transactional(readOnly = true)  // 只读事务
public Page<People> getPage(Integer pageNum, Integer pageLimit) {
Pageable pageable = new PageRequest(pageNum - 1,pageLimit);
return jpaRepo.findAll(pageable);
}
@Override
@Transactional(readOnly = true)  // 只读事务
public Page<People> getPage(Integer pageNum, Integer pageLimit) {
    Pageable pageable = PageRequest.of(pageNum - 1,pageLimit);
    return jpaRepo.findAll(pageable);
}
多条件排序
例如需要实现⼀个形如下⾯的sql:
select * from table where a='a' and b='b' order by c asc,d desc;
就是根据两个条件进⾏排序。
pageable实现类的构造⽅法中有个Sort参数,可以按照列属性进⾏排序。通过查看Sort类的构造⽅法,我们对Sort这个类进⾏⼀下分
析,Sort类中存在⼀下⼏个构造⽅法:
public orders);
public Sort(List<Order> orders);
public properties);
public Sort(Direction direction, properties);
public Sort(Direction direction, List<String> properties);
⼤概这⼏种构造⽅法,其中Direction 是⽤来标识按照列属性升序还是降序排序的。
properties即为列属性。
因为我们要排列的两个属性升序和降序都存在,4、5⽅法由于只能够实⽤⼀种排序⽅向,所以不能采⽤。
⽅法3只是输⼊列属性,按照默认的排序⽅式(ASC),因此也不能满⾜要求。
接下来我们看构造⽅法1和2,性质相同,主要是Order类的⽤途是怎样的。
sort of order看⼀下Order类的构造⽅法:
public Order(Direction direction, String property);
可以看到⼀个Order维护⼀个Direction 和⼀个列属性,正式我们所要的。
所以采⽤如下的⽅法:
List< Order> orders = new ArrayList< Order>();
orders.add( new Order(Direction. ASC, "c"));
orders.add( new Order(Direction. DESC, "d"));
Pageable pageable = PageRequest.of(pageNumber, pageSize, new Sort(orders));
jpaRepo.findByAAndB(a,b,pageable);
@PageableDefault
@PageableDefault注解的源码定义
package org.springframework.data.web;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.data.domain.Sort.Direction;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface PageableDefault {
int value() default 10;
int size() default 10;
int page() default 0;
String[] sort() default {};
Direction direction() default Direction.ASC;
}
@PageableDefault(sort = {"name"}, direction = Sort.Direction.ASC)注解表⽰默认以name正向排序,size默认为10个,page默认为第0页。
page :第⼏页,从0开始,默认为第0页
size :每⼀页的⼤⼩,默认为10
sort :排序相关的信息,以`property[,ASC|DESC]`的⽅式组织,例如`sort=firstname&sort=lastname,desc`表⽰在按firstname正序排列基础上按lastname倒序排列。