当前位置: 首页 >数据库 > 浅析PageHelper踩坑:stream流导致分页失效的问题及pagehelper版本升级导致pageSize为0时无法查询全部数据

浅析PageHelper踩坑:stream流导致分页失效的问题及pagehelper版本升级导致pageSize为0时无法查询全部数据

一、stream流导致分页失效的问题

  今天发现使用 PageHelper 进行分页时,分页失效了。查了下发现是这个原因,改了之后就正常了,记录一下。代码就不贴了,贴别人的。

1、问题场景:前端分页数据不对,始终只有 pageSize 10 条数据

2、业务代码

public ResultVo<PageInfo<StaffCardInfoVo>> findStaffCardList(@Valid StaffCardQueryDto staffCardQueryDto){  PageHelper.startPage(staffCardQueryDto.getPageCurrent(),staffCardQueryDto.getPageSize());  // 查询会员卡列表数据处理  List<StaffCardInfoVo> staffCardList = staffCardService.findStaffCardList(staffCardQueryDto);   PageInfo<StaffCardInfoVo> staffCardInfoVoPageInfo = new PageInfo<>(staffCardList);   retu ResultVoUtil.success(staffCardInfoVoPageInfo); }

3、问题处理说明

  pageHelper中调用数据库查询返回的集合信息,实际上返回的是 Page 类型的集合(继承ArrayList),看 PageHelper 源码就能发现:

public class Page<E> extends ArrayList<E> implements Closeable {private static final long serialVersionUID = 1L; // 省略属性方法 }

  对比其他分页查询接口发现会员卡查询接口中返回的会员卡列表集合的数据类型为 ArrayList,非 Page 集合。

  然后看到业务实现层中查询数据库之后有使用 stream 流对集合进行处理,处理之后返回的数据类型为 ArrayList,也就是失效的原因。

public List<StaffCardInfoVo> findStaffCardList(StaffCardQueryDto staffCardQueryDto) {  // 数据库查询会员卡,此时返回的staffCardList还是page集合类型  List<StaffCardInfoVo> staffCardList = staffCardMapper.findStaffCardList(staffCardQueryDto, Integer.valueOf(manageUserService.getStudioIdByToken()));
  staffCardList= staffCardList.stream().map(             staffCardInfoVo -> {               // 会员卡字段处理业务 retu staffCardInfoVo; }   ).collect(Collectors.toList());   // 此处返回的会员卡数据类型为ArrayList   retu staffCardList; }

浅析PageHelper踩坑:stream流导致分页失效的问题及pagehelper版本升级导致pageSize为0时无法查询全部数据 _ JavaClub全栈架构师技术笔记

  从上面源码可以看到:如果是 Page 的实例,就会分页;如果只是集合的实例,就不会分页,返回 list.size() ,所以一直返回 10 条数据。

4、处理方案

  就是使用 for 循环替代 stream 遍历处理,这里仅提供思路不提供具体实现。下面是我的修改,修改之后就正常了。

浅析PageHelper踩坑:stream流导致分页失效的问题及pagehelper版本升级导致pageSize为0时无法查询全部数据 _ JavaClub全栈架构师技术笔记

二、pagehelper版本升级导致pageSize为0时无法查询全部数据

可以看这篇文章:https://blog.csdn.net/weixin_40816738/article/details/124555594

1、前言:pageSize为0无效。

  修改配置 springboot版本升级后,pagehelper插件由1.2.3版本升级到1.4.1版本;发现升级之后pageSize为0时无法查询全部数据

2、application.properties文件配置pagehelper分页插件

// 旧版本#标识是数据库方言pagehelper.helperDialect=mysql#启用合理化,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页pagehelper.reasonable=true#为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZeropagehelper.params=count=countSql#支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页pagehelper.supportMethodsArguments=true#如果 pageSize=0 就会查询出全部的结果(相当于没有执行分页查询)pagehelper.page-size-zero=true// 新版本#标识是数据库方言pagehelper.helperDialect=mysql#启用合理化,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页pagehelper.reasonable=true#为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值, 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值, 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZeropagehelper.params=count=countSql#支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页pagehelper.supportMethodsArguments=true#如果 pageSize=0 就会查询出全部的结果(相当于没有执行分页查询)pagehelper.pageSizeZero=true

3、总结:pagehelper版本升级后,要想pageSize为0时查询全部数据,修改改以前的配置 pagehelper.page-size-zero=true 更改为 pagehelper.pageSizeZero=true

作者:古兰精
来源链接:https://www.cnblogs.com/goloving/p/16164817.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/database/117380.html

标签:MySQL升级
分享给朋友:

“浅析PageHelper踩坑:stream流导致分页失效的问题及pagehelper版本升级导致pageSize为0时无法查询全部数据” 的相关文章