Spring Data JPA的Pageable对象,实现对已查询出list的分页

Pageable对象

      使用Spring Data JPA的Pageable对象可以进行数据库的查询分页,这个实现已经有很多博客介绍过了,就不再列举了,可参考链接:https://www.tianmaying.com/tu... 等。

      但是有一种情况就是,pageable无法对已查询出数据的list结果进行分页,这在实际开发中几乎不可避免,很多复杂业务,出于简化开发或者考虑实际的原因,不可能通过一个sql查询实现需求,肯定会对查询出的list数据进行过滤,而这时pageable对象的分页功能则失效了,参考代码:

  List impiantos = myService.findMyMethod(); // returned 30 objects 
    Page pageImpianto = new PageImpl(impiantos, pageable, impiantos.size());

这种实现,是无法实现分页的。

根据spring data jpa作者的说法:

    Spring Data repositories support pagination on query methods by simply declaring a parameter of type Pageable to make sure they're only reading the data necessary for the requested Page.

     pageable对象只是对分页的一个基本实现,无法实现对已查询出的list结果进行分页。本人观点这种实现几乎没实际工程意义,建议在实际项目开发中不要使用pageable对象进行分页,如有不同观点,可留言讨论。

    为此,pageable对象要想实现分页,只能手动处理数据,示例代码如下:

if (pageable.getOffset() > ucShopCourseBizPojoList.size()) {
    long total = 0L;
    PageImpl emptyPage = new PageImpl<>(Lists.newArrayList(), pageable, total);
    resultDo.setResult(emptyPage);
    return resultDo;
}
 
if (pageable.getOffset() <= ucShopCourseBizPojoList.size() && pageable.getOffset() + pageable.getPageSize() > ucShopCourseBizPojoList.size()) {
    List bizPojos = ucShopCourseBizPojoList.subList(pageable.getOffset(), ucShopCourseBizPojoList.size());
    PageImpl pPage = new PageImpl<>(bizPojos, pageable, ucShopCourseBizPojoList.size());
    resultDo.setResult(pPage);
    return resultDo;
}
 
List ucShopCourseBizPojos = ucShopCourseBizPojoList.subList(pageable.getOffset(), pageable.getOffset() + pageable.getPageSize());
 
PageImpl pPage = new PageImpl<>(ucShopCourseBizPojos, pageable, ucShopCourseBizPojoList.size());

ucShopCourseBizPojoList是想要进行分页处理的list。

你可能感兴趣的:(springboot,jpa,java)