Spring Data JPA的Pageable物件,實現對已查詢出list的分頁
阿新 • • 發佈:2018-12-11
Pageable物件
但是有一種情況就是,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。