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);