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 Sort(Order... orders);
 
public Sort(List<Order> orders);
 
public Sort(String... properties);
 
public Sort(Direction direction, String... properties);
 
public Sort(Direction direction, List<String> properties);

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

properties即为列属性。

因为我们要排列的两个属性升序和降序都存在,4、5方法由于只能够实用一种排序方向,所以不能采用。

方法3只是输入列属性,按照默认的排序方式(ASC),因此也不能满足要求。

接下来我们看构造方法1和2,性质相同,主要是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倒序排列。

posted on 2019-03-06 18:53  疯狂的小萝卜头  阅读(1440)  评论(0编辑  收藏  举报