1. 程式人生 > >Spring Data JPA的Pageable物件,實現對已查詢出list的分頁

Spring Data JPA的Pageable物件,實現對已查詢出list的分頁

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。