Pageable对象
使用Spring Data JPA的Pageable对象可以进行数据库的查询分页,这个实现已经有很多博客介绍过了,就不再列举了,可参考链接:https://www.tianmaying.com/tu... 等。
但是有一种情况就是,pageable无法对已查询出数据的list结果进行分页,这在实际开发中几乎不可避免,很多复杂业务,出于简化开发或者考虑实际的原因,不可能通过一个sql查询实现需求,肯定会对查询出的list数据进行过滤,而这时pageable对象的分页功能则失效了,参考代码:
List<Impianto> impiantos = myService.findMyMethod(); // returned 30 objects
Page<Impianto> pageImpianto = new PageImpl<Impianto>(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<UcShopCourseBizPojo> emptyPage = new PageImpl<>(Lists.newArrayList(), pageable, total);
resultDo.setResult(emptyPage);
return resultDo;
}
if (pageable.getOffset() <= ucShopCourseBizPojoList.size() && pageable.getOffset() + pageable.getPageSize() > ucShopCourseBizPojoList.size()) {
List<UcShopCourseBizPojo> bizPojos = ucShopCourseBizPojoList.subList(pageable.getOffset(), ucShopCourseBizPojoList.size());
PageImpl<UcShopCourseBizPojo> pPage = new PageImpl<>(bizPojos, pageable, ucShopCourseBizPojoList.size());
resultDo.setResult(pPage);
return resultDo;
}
List<UcShopCourseBizPojo> ucShopCourseBizPojos = ucShopCourseBizPojoList.subList(pageable.getOffset(), pageable.getOffset() + pageable.getPageSize());
PageImpl<UcShopCourseBizPojo> pPage = new PageImpl<>(ucShopCourseBizPojos, pageable, ucShopCourseBizPojoList.size());
ucShopCourseBizPojoList是想要进行分页处理的list。