PageHelper分页失效,只能查出第一页

PageHelper分页失效,只能查出第一页

  • 1. 现象
  • 2. 原因
  • 3. PageHelper工作原理

1. 现象

  1. 分页代码如下:

    		int pageId = Constants.ONE;boolean isHasNextPage;do {PageHelper.startPage(pageId, Constants.DEFAULT_PAGE_SIZE);List<String> projectIdList = marketingConsStageDAO.getAllProjectId();PageInfo<String> pageInfo = new PageInfo<>(projectIdList);// 此处省略业务逻辑isHasNextPage = pageInfo.isHasNextPage();pageId++;} while (isHasNextPage);
    
  2. marketingConsStageDAO.getAllProjectId()代码如下:

    public List<String> getAllProjectId() {Weekend<MarketingConsStage> weekend = Weekend.of(MarketingConsStage.class, true, true);weekend.selectProperties("projectId");weekend.setDistinct(true);return marketingConsStageMapper.selectByExample(weekend).stream().map(MarketingConsStage::getProjectId).collect(Collectors.toList());}
    
  3. marketingConsStageDAO.getAllProjectId()应该返回两万余条数据,因此预期do-while循环会执行很多次,但是发现第一页的isHasNextPage就为false,无法继续执行do-while循环;

2. 原因

  1. 进行debug,将断点打到

    PageInfo<String> pageInfo = new PageInfo<>(projectIdList);
    

    这一行,然后发现返回的projectIdListArrayList类型;在这里插入图片描述

  2. 看一下PageInfo的构造方法:

    		/*** 包装Page对象** @param list          page结果* @param navigatePages 页码数量*/public PageInfo(List<T> list, int navigatePages) {super(list);if (list instanceof Page) {Page page = (Page) list;this.pageNum = page.getPageNum();this.pageSize = page.getPageSize();this.pages = page.getPages();this.size = page.size();//由于结果是>startRow的,所以实际的需要+1if (this.size == 0) {this.startRow = 0;this.endRow = 0;} else {this.startRow = page.getStartRow() + 1;//计算实际的endRow(最后一页的时候特殊)this.endRow = this.startRow - 1 + this.size;}} else if (list instanceof Collection) {this.pageNum = 1;this.pageSize = list.size();this.pages = this.pageSize > 0 ? 1 : 0;this.size = list.size();this.startRow = 0;this.endRow = list.size() > 0 ? list.size() - 1 : 0;}if (list instanceof Collection) {calcByNavigatePages(navigatePages);}}
    
  3. 可以看到,由于projectIdListArrayList类型,因此在创建pageInfo对象时,总页数直接走了this.pages = this.pageSize > 0 ? 1 : 0;的逻辑,导致分页失效;

  4. 如果我们将

    .stream()
    .map(MarketingConsStage::getProjectId)
    .collect(Collectors.toList());
    

    操作放到分页查询操作外面,将代码修改为:

    		int pageId = Constants.ONE;boolean isHasNextPage;do {PageHelper.startPage(pageId, Constants.DEFAULT_PAGE_SIZE);List<MarketingConsStage> marketingConsStageList = marketingConsStageDAO.getAllProjectId();PageInfo<MarketingConsStage> pageInfo = new PageInfo<>(marketingConsStageList);List<String> projectIdList = marketingConsStageList.stream().map(MarketingConsStage::getProjectId).collect(Collectors.toList());// 此处省略业务逻辑isHasNextPage = pageInfo.isHasNextPage();pageId++;} while (isHasNextPage);
    

    marketingConsStageDAO.getAllProjectId()修改为:

    public List<MarketingConsStage> getAllProjectId() {Weekend<MarketingConsStage> weekend = Weekend.of(MarketingConsStage.class, true, true);weekend.selectProperties("projectId");weekend.setDistinct(true);return marketingConsStageMapper.selectByExample(weekend);}
    

    然后debug就会发现,marketingConsStageList是一个Page类型变量,此时分页功能就正常了;在这里插入图片描述

3. PageHelper工作原理

  1. PageHelper是一个MyBatis分页插件,它可以帮助我们在查询数据的时候进行分页处理。当我们调用PageHelper.startPage(pageNum, pageSize)方法时,它会在底层使用ThreadLocal来保存当前线程的分页参数,然后通过拦截器对SQL语句进行改写,从而实现分页查询。
  2. 在我们调用完PageHelper.startPage(pageNum, pageSize)方法后,紧接着执行的SQL查询语句会被PageHelper拦截并进行改写,从而在查询结果的时候只返回指定页数和每页记录数的数据。PageHelper会将查询结果封装成一个Page对象,这个Page对象包含了查询结果的总记录数、当前页数、每页记录数以及查询结果的数据列表。
  3. 因此,当我们调用查询方法后,返回的list可以被PageHelper包装成Page对象。这是因为PageHelper在底层对查询结果进行了封装,将查询结果以Page对象的形式返回给了调用方。调用方可以通过Page对象获取查询结果的各种信息,如总记录数、当前页数、每页记录数等,同时也可以通过Page对象获取查询结果的数据列表。
  4. 总之,通过PageHelper实现分页查询的过程可以概括为:开启分页查询 -> 执行查询操作 -> 将查询结果列表返回给调用方,并以Page对象的形式包装 -> 调用方通过Page对象获取分页查询的各种信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/3016.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SCI一区】【电动车】基于ADMM双层凸优化的燃料电池混合动力汽车研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 1.2 电动车动力学方程 1.3 电池模型 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、数据、文章讲解 &#x1f4a5;1 概述 文献来源&#xff1a; 随着车辆互联性的出现&#xff0c;互联汽车 (CVs) 在增强道路安全、改…

数学建模-图论 最短路径

作图 %% 注意&#xff1a;以下代码需要较新版本的matlab才能运行&#xff08;最好是2016版本及以上哦&#xff09; % 如果运行出错请下载新版的matlab代码再运行%% Matlab作无向图 % &#xff08;1&#xff09;无权重&#xff08;每条边的权重默认为1&#xff09; % 函数graph(…

SQL进阶(2)——SQL语句类型 增删改查CRUD 事务初步 表关联关系 视图 +索引

目录 引出SQL语句类型1.DML数据操纵语言&#xff08;重点&#xff09;2.DQL数据查询语言&#xff08;重点&#xff09;3.DDL(Data Definition Language了解)4.DCL(Data Control Language了解)5.TCL 事务控制语言 运算符和其他函数1.运算符2.其它函数增删改查CRUD 视图索引事务1…

如何克服Leetcode做题的困境

文章目录 如何克服Leetcode做题的困境问题背景克服困境的建议实践与理论结合切忌死记硬背分析解题思路不要过早看答案迭代式学习寻求帮助坚持与耐心查漏补缺 结论 如何克服Leetcode做题的困境 问题背景 明明自觉学会了不少知识&#xff0c;可真正开始做Leetcode题目时&#x…

内存参数问题导致内存溢出

问题&#xff1a;内存参数问题导致内存溢出 1、文件过大&#xff0c;进行分块 2、 运行参数&#xff0c;使用最大内存配置2时&#xff0c;导致空指针异常。 3、获取详细报错信息-内存溢出 多线程捕获Throwable异常 修改代码&#xff0c;捕获Throwable&#xff0c;获取异常 异…

vue中预览pdf

情况一 如果后端返回的pdf地址&#xff0c;粘贴到浏览器的url框中&#xff0c;可以在浏览器中直接进行预览的&#xff0c;那么我们就用window.open&#xff0c;或 a标签&#xff0c;或iframe标签通过设置src进行预览即可 法1&#xff1a;可以直接使用window.open&#xff08;…

leetcode100.相同的树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;相同的树 1️⃣ 代码&#xff1a; bool isSameTree(struct TreeNode* p, struct TreeNode* q){// 判断两棵树当前结点是否为空if (p NULL && q NULL) {// 说明是相同的return true;}// 来到这里有几种情况// …

【实战篇】docker-compose部署go项目

一、场景&#xff1a; 二、需求 三、实操 Stage 1&#xff1a;GoLand 中 build 生成二进制文件 Stage 2&#xff1a;编写 Dockerfile Stage 3&#xff1a;编写 docker-compose.yaml Stage 4&#xff1a;文件上传到 ubuntu 服务器上&#xff0c;并设置文件读写权限 Stage…

前端 | (二)各种各样的常用标签 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;HTML排版标签&#x1f4da;HTML语义化标签&#x1f4da;块级元素与行内元素&#x1f4da;文本标签&#x1f407;常用的文本标签&#x1f407;不常用的文本标…

Kubernetes Service的过程

文章目录 Kubernetes Service的实现基础内容1. 命令 ip route show table all2. DNAT3. IPVS和iptables4. Service Service的实现简述 Kubernetes Service的实现 基础内容 在了解Service之前,需要先了解一些额外的知识: 命令: ip route show table allDNATIPVS和iptables基础…

idea不小心push的文件夹怎么处理?

第一种方式&#xff0c;把不小心push上去的人解决掉。 第二种方式&#xff0c;以我自身为例&#xff0c;同事不小心push了.idea文件夹 首先打开git bash git rm --cached .idea/ -r 然后查看一下状态 git status 接着提交修改 git commit -m "cancel track .idea file&q…

【Redis】高可用之三:集群(cluster)

本文是Redis系列第6篇&#xff0c;前5篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xf…

Linux基础(三)端口、进程及主机状态管理、环境变量、文件管理

目录 端口 nmap netstat 进程管理 查看进程 关闭进程 主机状态监控 系统资源top命令 磁盘信息监控 网络状态监控 环境变量 $符号 自己设置环境变量 自定义环境变量PATH Linux的文件和下载 压缩和解压 tar命令 zip和unzip命令 端口 每个电脑有一个ip地址&#xff…

Vue项目实现在线预览pdf,并且可以批量打印pdf

最近遇到一个需求,就是要在页面上呈现pdf内容,并且还能用打印机批量打印pdf,最终效果如下: 当用户在列表页面,勾选中两条数据后,点击“打印表单”按钮之后,会跳到如下的预览页面: 预览页面顶部有个吸顶的效果,然后下方就展示出了2个pdf文件对应的内容,我们接着点击“…

echarts 地图点击常见问题

echats 散点图不支持缩放 echarts 地图点击激活label如何去除 高德loca 1.4版本热力图报错 绘制的颜色区间是 0 --1 高德地图销毁不生效 自己傻逼&#xff0c;每次没有清空数组导致叠加数据&#xff0c;约点数据越多。 为何用高德地图district.search查询不到别的省数据&…

[微信小程序] movable-view 可移动视图容器 - 范围问题

movable-view 可移动视图容器 可移动视图容器&#xff0c;在页面中可以拖拽滑动。movable-view必须在 movable-area 组件中&#xff0c;并且必须是直接子节点 <view><movable-area style"width: 750rpx;height: 200rpx;background-color: gainsboro;">&l…

Java的数据结构-Map集合

文章目录 Map概述Map常用方法Map遍历元素的方法1.方法一&#xff1a;keySet()2.方法二&#xff1a;entrySet() HashMap Map概述 1、Map和collection没有继承关系2、Map集合以key和value的方式存储数据&#xff1a;键值对key和value都是引用数据类型。key和value都是存储对象的…

(栈队列堆) 剑指 Offer 31. 栈的压入、弹出序列 ——【Leetcode每日一题】

❓ 剑指 Offer 31. 栈的压入、弹出序列 难度&#xff1a;中等 输入两个整数序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某栈的压栈序列&#xff0c;序…

Appium Android ——利用 TestNG 并行执行用例

目录 前言&#xff1a; 一、测试类 二、连接两个 Android 设备或启动两个虚拟机 三、项目路径下新建两个 testng.xml 四、开启两个 appium server 五、导出依赖 六、执行测试 七、查看报告 前言&#xff1a; Appium是一个流行的移动应用自动化测试工具&#xff0c;…