PagingAndSortingRepository和 JpaSpecificationExecutor接口实现大数据量的数据分页查询

PagingAndSortingRepository

1.PagingAndSortingRepository接口提供了一下接口:

@NoRepositoryBean
public interface PagingAndSortingRepository extends CrudRepository {
    Iterable findAll(Sort var1);//得到经过排序的所有数据

    Page findAll(Pageable var1); //经过分页之后的某一页的数据
}

 

findAll(Pageable var1)中封装的功能强大,参数是Pageable类型,这个var1参数中包含了pageNumber和PageSize两个参数,当然,还可以添加Sort参数,在分页时进行排序。像这样:

 

Pageable page = PageRequest(pageNumber,pageSize,sort)
Pageable page = PageRequest(pageNumber,pageSize)

这个page对象中存储了所有分页的信息。

 

 

2.Pageable

Pageable 是一个接口,他的实现类是PageRequest。这个PageRequest有三个实现构造方法: 
(下面的代码是从网上复制粘贴的,仅用于展示其操作)


 

//这个构造出来的分页对象不具备排序功能
public PageRequest(int page, int size) {
    this(page, size, (Sort)null);
}
//Direction和properties用来做排序操作
public PageRequest(int page, int size, Direction direction, String... properties) {
    this(page, size, new Sort(direction, properties));
}
//自定义一个排序的操作
public PageRequest(int page, int size, Sort sort) {
    super(page, size);
    this.sort = sort;
}

这里外加一个衍生查询的定义,需要的时候可以用到: 
PagingAndSortingRepository接口中只有findAll方法,想要实现分页我就就要集成这个接口,当然我们在使用PagingAndSortingRepository提供的findAll方法的同时,还可以使用SpringDataJPA中Repository的衍生查询,(也就是自定义根据属性名称或者是添加@Query查询的方法,比如:findByAge)  ,在这些衍生查询方法的参数中只要把pageable参数放置在最后一个,就可以实现同时分页的功能。像是这样(下面是一段手写的kotlin代码):

fun findByAge:Iterable(pageNumber:int,pageSize:int,age:Int){
    Val page = PageRequest(pageNumber,pageSize)
    Val list = findByAge(age,page)
    Return list
}

 

 

 

SpringDataJPA在提供分页的同时,也提供了类似于hibernate的Criteria的查询方式:

要使用这种方式,就需要继承我上面说过的接口:JpaSpecificationExecutor,这个接口有以下方法:

Optional findOne(@Nullable Specification var1);
    List findAll(@Nullable Specification var1);
    Page findAll(@Nullable Specification var1, Pageable var2);
    List findAll(@Nullable Specification var1, Sort var2);
    long count(@Nullable Specification var1);

 

这个接口通过Specification来定义查询的条件,(也就是说,在这里,在使用Specification查询条件的同时,使用上面第三个方法,将Pageable作为参数传入,就能实现查询分页。)在实现Specification这个接口的同时,重写其中的toPredict方法,自定义查询的条件。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(spring,boot学习笔记,Java)