问题描述
在使用PageHelper进行分页的时候,大部分时候都是正常的,但是有一个接口的分页总数一直有问题(为当前页的数量、页数一直为1)。先看看目前的代码:
Controller层代码(修改前):
1 | public PageResponseMsg queryPolicyTypePageList({ PageRequest<PolicyTypePageReq> noticePageReq) |
Service层代码:
1 |
|
controller代码与其他分页查询接口完全一样,service也没做其他数据库的操作,真是奇怪了。
问题原因
搜了几篇博客,发现问题出现在Map转实体这个步骤。原因如下:
- PageHelper.startPage(pageIndex, pageSize);返回Page对象(继承ArrayList),里面有总数、当前页、页数等信息。
- policyTypeService.queryPolicyTypePageList(pageReq);返回的实际也是Page对象,所以在进行Map转换的时候会丢失Page的分页信息。
PageHelper的部分源码:
1 | public PageInfo(List<T> list, int navigatePages) { |
问题解决
把服务层代码修改一下,核心就是数据库查出list后,直接创建PageInfo对象,具体代码如下:
1 | // 设置分页 |
其他问题
在分页开始后对pageReq进行数据封装也会使分页失效。解决方法一样:PageHelper代码放在操作数据库前后(Mapper层)。
1 | // 获取分页 |
小结
- 用PageHelper分页不能对pageReq对象进行赋值,不能对查询出的结果进行对象转换。
- PageHelper代码要放在service层,且紧跟着查询数据库的代码。