PageHelper 分页无效的坑。。。
1.问题

1.1.PageHelper先开启分页,后对list数据操作
@Override
public?PageInfo?getRecordsByView(int?pageNo,?int?pageSize)?{
????PageHelper.startPage(pageNo,pageSize);
????List?hdQueryVosByView?=?actionMapper.getActionByView();
????List?hdQueryVos?=?new?ArrayList<>();
????for?(HdQueryVo?hdQueryVo?:?hdQueryVosByView)?{
????????HdQueryVo?hdQueryVoSingle?=?new?HdQueryVo();
????????hdQueryVoSingle.setHdId(hdQueryVo.getHdId());
????????hdQueryVoSingle.setHdType(hdQueryVo.getHdType());
????????hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());
????????hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());
????????hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());
????????hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());
????????hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());
????????hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());
????????hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());
????????hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());
????????hdQueryVoSingle.setUserId(hdQueryVo.getUserId());
????????if?(hdQueryVo.getHdType().equals(0))?{
????????????hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));
????????}?else?{
????????????hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));
????????}
????????hdQueryVos.add(hdQueryVoSingle);
????}
????PageInfo?pageViewInfo?=?new?PageInfo<>(hdQueryVos);
????return?pageViewInfo;
}
可以分页,但是数据量错误,total始终等于每页数据量,即pageSize


1.2.先对list数据进行操作,后开启分页
@Override
public?PageInfo?getRecordsByView(int?pageNo,?int?pageSize)?{
????
????List?hdQueryVosByView?=?actionMapper.getActionByView();
????List?hdQueryVos?=?new?ArrayList<>();
????for?(HdQueryVo?hdQueryVo?:?hdQueryVosByView)?{
????????HdQueryVo?hdQueryVoSingle?=?new?HdQueryVo();
????????hdQueryVoSingle.setHdId(hdQueryVo.getHdId());
????????hdQueryVoSingle.setHdType(hdQueryVo.getHdType());
????????hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());
????????hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());
????????hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());
????????hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());
????????hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());
????????hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());
????????hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());
????????hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());
????????hdQueryVoSingle.setUserId(hdQueryVo.getUserId());
????????if?(hdQueryVo.getHdType().equals(0))?{
????????????hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));
????????}?else?{
????????????hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));
????????}
????????hdQueryVos.add(hdQueryVoSingle);
????}
????PageHelper.startPage(pageNo,pageSize);
????PageInfo?pageViewInfo?=?new?PageInfo<>(hdQueryVos);
????return?pageViewInfo;
}
数据可以查询出来,总数total也正确,但是分页功能失效。(这份阿里 Java 开发手册可以关注公众号Java核心技术,回复:手册)



2.原因
PageHelper中startPage开启分页方法只对后面的sql查询起作用。另外,关注公众号Java技术栈,在后台回复:面试,可以获取我整理的 Java 系列面试题和答案,非常齐全。
1.1 错误原因是提前开启分页后,对list操作,即PageInfo pageViewInfo = new PageInfo<>(hdQueryVos);

/**
*?包装Page对象
*
*?@param?list
*/
public?PageInfo(List?list)?{
?this(list,?8);
}
只是把list转为PageInfo对象,不影响前面分页数据的操作。Spring Boot 学习笔记,分享给你。
1.2 错误原因是先对list操作后,开启翻页后没有sql语句

即sql语句没有参与分页查询。
3.解决方案
直接对分页后的PageInfo对象中的数据进行操作
对list集合操作,先取出PageInfo里的list集合数据,再对数据进行相关操作 将操作完后的list集合再次存到PageInfo里,进行return


@Override
public?PageInfo?getRecordsByView(int?pageNo,?int?pageSize)?{
????PageInfo?source?=?PageHelper.startPage(pageNo,?pageSize).doSelectPageInfo(()->{
????????actionMapper.getActionByView();
????});
????//?需要转换的对象
????PageInfo?target?=?new?PageInfo<>();
????//?复制分页属性
????BeanUtils.copyProperties(source,?target);
????//?对查询的list进行下一步操作,比如类型转换后
????List?collect?=?source.getList().stream().collect(Collectors.toList());
????List?hdQueryVos?=?new?ArrayList<>();
????for?(HdQueryVo?hdQueryVo?:?collect)?{
????????HdQueryVo?hdQueryVoSingle?=?new?HdQueryVo();
????????hdQueryVoSingle.setHdId(hdQueryVo.getHdId());
????????hdQueryVoSingle.setHdType(hdQueryVo.getHdType());
????????hdQueryVoSingle.setHdTitle(hdQueryVo.getHdTitle());
????????hdQueryVoSingle.setHdStartDate(hdQueryVo.getHdStartDate());
????????hdQueryVoSingle.setHdEndDate(hdQueryVo.getHdEndDate());
????????hdQueryVoSingle.setHdStatus(hdQueryVo.getHdStatus());
????????hdQueryVoSingle.setHdImage(hdQueryVo.getHdImage());
????????hdQueryVoSingle.setHdNumber(hdQueryVo.getHdNumber());
????????hdQueryVoSingle.setGmtCreate(hdQueryVo.getGmtCreate());
????????hdQueryVoSingle.setGmtModified(hdQueryVo.getGmtModified());
????????hdQueryVoSingle.setUserId(hdQueryVo.getUserId());
????????if?(hdQueryVo.getHdType().equals(0))?{
????????????hdQueryVoSingle.setHdJoinUsers(onlineWorksMapper.getOnlineJoinUsers(hdQueryVo.getHdId()));
????????}?else?{
????????????hdQueryVoSingle.setHdJoinUsers(offlineUsersMapper.getOfflineJoinUsers(hdQueryVo.getHdId()));
????????}
????????hdQueryVos.add(hdQueryVoSingle);
????}
????//?加工后的数据放入新的pageinfo
????target.setList(hdQueryVos);
????return?target;
}



原文链接:https://blog.csdn.net/qq_35080796/article/details/105508744
参考资料:
版权声明:本文为CSDN博主「He Ain't Hero」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
—————————————
往期精彩:
社群福利:程序员技术交流群
这可能是你离头部大佬最近的一次,为提高群成员质量,表哥特意邀请了华为、腾讯、阿里的朋友进群,方便大家学习交流,一起进步。
有兴趣入群的同学,可长按扫描下方二维码,一定要备注:城市+昵称+技术方向,根据格式备注,可更快被通过且邀请进群

▲长按扫
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/
关注网络尖刀微信公众号随时掌握互联网精彩
- 1 “反腐败没有选择 必须知难而进” 7904668
- 2 财政部官宣:明年“国补”继续 7809584
- 3 爸爸冲奶粉 9个月宝宝急到开口说话 7712418
- 4 为何今年全国粮食产量再创新高 7616615
- 5 2026年央视春晚分会场官宣 7521589
- 6 为啥明明很困但就是睡不着 7428404
- 7 辽宁一饭店火灾致22死 调查报告发布 7330635
- 8 王楚钦率队卫冕乒超男团冠军 7235020
- 9 女子开新能源车意外冲进河里遇难 7138955
- 10 成龙自曝和儿子一年打不了一次电话 7041812







程序员狗哥
