PageHelper 這個插件用了很多次了,今天使用的時候才發現中間有一個大坑,就是使用這個插件中間只能有一次查詢的操作語句,不能再添加其它語句(兩行代碼之間不能再有其他代碼)!
例如,我們一般都是這樣進行查詢:
//創建一個PageResult對象出來
PageResult<AdvertInfo> pageResult = new PageResult<>();
//開啓分頁,pageNum代表當前頁數,pageSize代表每頁總數
PageHelper.startPage(pageNum, pageSize);
//查詢數據庫的語句,pageHelper在這裏做一次攔截器操作
List<AdvertInfo> advertList = advertMapper.getAdvertList(advertInfoParam);
//使用PageInfo包裝結果
PageInfo<AdvertInfo> pageInfo = new PageInfo<>(advertList);
上述操作是這樣的,但是如果我們需要將查詢的 List<AdvertInfo>
轉換成前端展示的 ViewObject 對象,那麼我們想當然會在中間做一次操作:
PageHelper.startPage(pageNum, pageSize);
List<AdvertInfo> advertList = advertMapper.getAdvertList(advertInfoParam);
//將AdvertInfo某些字段要隱藏,不在前臺展示,所以需要轉換成前端需要的bean對象
List<AdvertInfoVO> AdvertInfoList = new ArrayList<>();
for (AdvertInfo info : pageInfo.getList()) {
res.add(convertAdvertInfoToVO(info));
}
//然後再包裝一下前端對象
PageInfo<AdvertInfoVO> pageInfo = new PageInfo<>(AdvertInfoList);
這樣獲取的 pageInfo.getTotal()
一直是當前的 pageSize總數,而不是查詢的總條數。所以,我們最好不要在 pageHelper 兩個語句中間插入其它語句,而是在後面做一些操作:
//分頁查詢
PageHelper.startPage(pageNum, pageSize);
List<AdvertInfo> advertList = advertMapper.getAdvertList(advertInfoParam);
PageInfo<AdvertInfo> pageInfo = new PageInfo<>(advertList);
//轉換成前端VO
List<AdvertInfoVO> advertInfoList = new ArrayList<>();
for (AdvertInfoinfo : pageInfo.getList()) {
advertInfoList.add(convertAdvertInfoToVO(info));
}
//那麼這樣就可以正確返回了!
return new LayuiTableResult(0, "查詢成功", pageInfo.getTotal(), advertInfoList);