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 习近平将发表二〇二六年新年贺词 7904141
- 2 2026年国补政策来了 7808738
- 3 东部战区:开火!开火!全部命中! 7712893
- 4 2026年这些民生政策将惠及百姓 7616985
- 5 小学食堂米线过期2.5小时被罚5万 7519709
- 6 解放军喊话驱离台军 原声曝光 7428214
- 7 为博流量直播踩烈士陵墓?绝不姑息 7327605
- 8 每月最高800元!多地发放养老消费券 7238391
- 9 数字人民币升级 1月1日起将计付利息 7141831
- 10 2026年1月1日起 一批新规将施行 7040675


![你又不是小章 妈妈拍的[喵喵] ](https://imgs.knowsafe.com:8087/img/aideep/2021/10/6/cfd1732974a70605dbdaa0c5f3117c49.jpg?w=250)




程序员狗哥
