一、stream流導致分頁失效的問題
今天發現使用 PageHelper 進行分頁時,分頁失效了。查了下發現是這個原因,改了之后就正常了,記錄一下。代碼就不貼了,貼別人的。
1、問題場景:前端分頁數據不對,始終只有 pageSize 10 條數據
2、業務代碼
public ResultVo<PageInfo<StaffCardInfoVo>> findStaffCardList(@Valid StaffCardQueryDto staffCardQueryDto){ PageHelper.startPage(staffCardQueryDto.getPageCurrent(),staffCardQueryDto.getPageSize()); // 查詢會員卡列表數據處理 List<StaffCardInfoVo> staffCardList = staffCardService.findStaffCardList(staffCardQueryDto); PageInfo<StaffCardInfoVo> staffCardInfoVoPageInfo = new PageInfo<>(staffCardList); return ResultVoUtil.success(staffCardInfoVoPageInfo); }
3、問題處理說明
pageHelper中調用數據庫查詢返回的集合信息,實際上返回的是 Page 類型的集合(繼承ArrayList),看 PageHelper 源碼就能發現:
public class Page<E> extends ArrayList<E> implements Closeable { private static final long serialVersionUID = 1L; // 省略屬性方法 }
對比其他分頁查詢接口發現會員卡查詢接口中返回的會員卡列表集合的數據類型為 ArrayList,非 Page 集合。
然后看到業務實現層中查詢數據庫之后有使用 stream 流對集合進行處理,處理之后返回的數據類型為 ArrayList,也就是失效的原因。
public List<StaffCardInfoVo> findStaffCardList(StaffCardQueryDto staffCardQueryDto) { // 數據庫查詢會員卡,此時返回的staffCardList還是page集合類型 List<StaffCardInfoVo> staffCardList = staffCardMapper.findStaffCardList(staffCardQueryDto, Integer.valueOf(manageUserService.getStudioIdByToken()));
staffCardList= staffCardList.stream().map( staffCardInfoVo -> { // 會員卡字段處理業務 return staffCardInfoVo; } ).collect(Collectors.toList()); // 此處返回的會員卡數據類型為ArrayList return staffCardList; }
從上面源碼可以看到:如果是 Page 的實例,就會分頁;如果只是集合的實例,就不會分頁,返回 list.size() ,所以一直返回 10 條數據。
4、處理方案
就是使用 for 循環替代 stream 遍歷處理,這里僅提供思路不提供具體實現。下面是我的修改,修改之后就正常了。
二、pagehelper版本升級導致pageSize為0時無法查詢全部數據
可以看這篇文章:https://blog.csdn.net/weixin_40816738/article/details/124555594
1、前言:pageSize為0無效。
修改配置 springboot版本升級后,pagehelper插件由1.2.3版本升級到1.4.1版本;發現升級之后pageSize為0時無法查詢全部數據
2、application.properties文件配置pagehelper分頁插件
// 舊版本 #標識是數據庫方言 pagehelper.helperDialect=mysql #啟用合理化,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 pagehelper.reasonable=true #為了支持startPage(Object params)方法,增加了該參數來配置參數映射,用於從對象中根據屬性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值, 默認值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero pagehelper.params=count=countSql #支持通過 Mapper 接口參數來傳遞分頁參數,默認值false,分頁插件會從查詢方法的參數值中,自動根據上面 params 配置的字段中取值,查找到合適的值時就會自動分頁 pagehelper.supportMethodsArguments=true #如果 pageSize=0 就會查詢出全部的結果(相當於沒有執行分頁查詢) pagehelper.page-size-zero=true
// 新版本 #標識是數據庫方言 pagehelper.helperDialect=mysql #啟用合理化,如果pageNum<1會查詢第一頁,如果pageNum>pages會查詢最后一頁 pagehelper.reasonable=true #為了支持startPage(Object params)方法,增加了該參數來配置參數映射,用於從對象中根據屬性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默認值, 默認值為pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero pagehelper.params=count=countSql #支持通過 Mapper 接口參數來傳遞分頁參數,默認值false,分頁插件會從查詢方法的參數值中,自動根據上面 params 配置的字段中取值,查找到合適的值時就會自動分頁 pagehelper.supportMethodsArguments=true #如果 pageSize=0 就會查詢出全部的結果(相當於沒有執行分頁查詢) pagehelper.pageSizeZero=true
3、總結:pagehelper版本升級后,要想pageSize為0時查詢全部數據,修改改以前的配置 pagehelper.page-size-zero=true 更改為 pagehelper.pageSizeZero=true