淺析PageHelper踩坑:stream流導致分頁失效的問題
阿新 • • 發佈:2022-04-19
今天發現使用 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 遍歷處理,這裡僅提供思路不提供具體實現。下面是我的修改,修改之後就正常了。