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

news2024/11/24 15:02:16

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的,所以实际的需要+1
                if (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.coloradmin.cn/o/772114.html

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

相关文章

python发送邮件yagmail库

yagmail库发送邮件简洁&#xff0c;代码量少 多次测试文件发送只能接收到表、文档、pdf、ppt import yagmaildef send_yagmail(sender, send_password, addressee, hostsmtp.qq.com, port465):yag yagmail.SMTP(sender, send_password, host, port)img_url https://img2.bai…

kali密码攻击之在线攻击hydra

hydra与hydra-graphical 1.介绍 Hydra是一款非常强大的暴力破解工具&#xff0c;它是由著名的黑客组织THC开发的一款开源暴力破解工具。Hydra是一个验证性质的工具&#xff0c;主要目的是&#xff1a;展示安全研究人员从远程获取一个系统认证权限 支持以下协议爆破&#xff1…

Redis实战案例21-消息队列

1. 基于JVM的阻塞队列的局限 JVM内存限制问题&#xff0c;大量订单出现时&#xff0c;可能会超过JVM阻塞队列上限&#xff1b;阻塞队列并不能持久化&#xff0c;因为内存不能持久化&#xff0c;出现异常或者宕机之类的故障时&#xff0c;出现数据丢失&#xff1b; 所以引出消息…

Linux内核的任务:

硬件与软件之间的中间层&#xff1a;内核在技术层面上充当硬件和软件之间的中间层&#xff0c;负责将应用程序的请求传递给硬件&#xff0c;并处理硬件设备和组件的寻址和操作。 应用程序的接口&#xff1a;对于应用程序来说&#xff0c;内核是它们与硬件之间的接口。应用程序通…

基于 chinese-roberta-wwm-ext 微调训练 6 分类情感分析模型

一、模型和数据集介绍 1.1 预训练模型 chinese-roberta-wwm-ext 是基于 RoBERTa 架构下开发&#xff0c;其中 wwm 代表 Whole Word Masking&#xff0c;即对整个词进行掩码处理&#xff0c;通过这种方式&#xff0c;模型能够更好地理解上下文和语义关联&#xff0c;提高中文文…

NAS 问题处理记录

在解决自动配网的过程中&#xff0c;突然NAS不给力&#xff0c;偏偏这个时间找事情。上面这两个问题&#xff0c;说不复杂也不复杂&#xff0c;主要是自己在完全远程处理&#xff0c;很多不方便。当然少不了师弟的助攻&#xff0c;很感谢我的师弟帮忙&#xff0c;实验室的网络不…

Flink 启动就报错,但exception没提示。其中一个task failure 该怎么办?

文章目录 前言一、排查二、解决 前言 最近我在生产又遇到一个问题&#xff0c;就是消费着一段时间之后&#xff0c;忽然就不再消费了&#xff0c;但也不报错。观察了几次&#xff0c;我发现时间基本是停留在上下班高峰期数据量最大的时候。我主观猜测可能是同时间进来的数据过…

css通过子元素选择父元素

伪类:has选择父元素 td:has(> .unfoldTable){//可选中所有td下包含unfoldTable的class标签的td属性color: red; }td:has(> div){//可选中所有td下包含div标签的td属性color: red; } 特殊举例分析&#xff1a; 个别UI框架个别标签通过事件直接生成或者无法选中的情况。…

爆肝整理,Postman接口测试-全局变量/接口关联/加密/解密(超细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 全局变量和环境变…

随手记——前端安全策略 Content-Security-Policy – CSP

随手记——前端安全策略 Content-Security-Policy – CSP 一、问题 1. 问题&#xff1a;前端meta标签中配置了CSP安全策略&#xff0c;导致使用第三方地图插件的时间报错不展示 2. 原安全配置&#xff1a; <meta http-equiv"Content-Security-Policy" content&…

STM32MP157驱动开发——按键驱动(查询方式)

文章目录 概述APP 读取按键的 4 种方法查询方式休眠-唤醒方式poll 方式异步通知方式 查询方式的按键驱动程序&#xff08;框架&#xff09;按键驱动编写思路board_xxx.cbutton_drv.cbutton_drv.hbutton_test.cMakefile编译测试 查询方式的按键驱动程序(stm32mp157)board_stm32m…

常见Redis使用问题

一 lettuce使用问题 1 问题描述 Redis Cluster集群&#xff0c;当master宕机&#xff0c;主从切换&#xff0c;客户端报错 timed out 2 原因 SpringBoot2.X版本开始Redis默认的连接池都是采用的Lettuce。当节点发生改变后&#xff0c;Letture默认是不会刷新节点拓扑的。 3…

Spring+SpringMvc+Mybatis整合小Demo

原始方式整合SSM 不使用spring-mybatis包 项目内容 整合ssm完成对account表新增和查询的操作 项目大体结构 创建mavenWeb项目 pom文件中引入依赖 spring核心、aspectj(aop)、spring-jdbc(jdbcTemplate)、spring-tx(事务)、 数据源&#xff1a;mysql、c3p0、mybatis my…

linux之Ubuntu系列 find 、 ln 、 tar、apt-get 指令 软链接和硬链接

查找文件 find 命令 功能非常强大&#xff0c;通常用来在 特定的目录下 搜索 符合条件的文件 find [path] -name “.txt” 记得要加 “ ” 支持通配符 &#xff0c;正则表达式 包括子目录 ls 不包括 子目录 如果省略路径&#xff0c;表示 在当前路径下&#xff0c;搜索 软链接…

测试老鸟总结,性能测试-最佳并发和最大并发,性能测试实施...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试&#xf…

无涯教程-Javascript - Switch语句

从JavaScript 1.2开始&#xff0c;您可以使用 switch 语句来处理这种情况&#xff0c;它比重复的 if ... else if 语句更有效。 流程图 以下流程图说明了switch-case语句的工作原理。 switch 语句的目的是给出一个要求值的表达式&#xff0c;并根据表达式的值执行多个不同的语…

云曦暑期学习第一周——sql注入

1浅谈sql注入 1.1sql注入 sql注入是指web应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是攻击者可控的&#xff0c;并且参数带入数据库查询&#xff0c;攻击者可以通过构造不同的sql语句来实现对数据库的任意操作 1.2原理 条件&#xff1a; 1.参…

接入端口与中继端口

交换机端口是支持 IT 的基本组件&#xff0c;可实现网络通信。这些有线硬件设备负责连接并允许在不同设备和连接到其端口的网络部分之间进行数据传输。由于网络管理员在确保网络连接和可用性方面发挥着关键作用&#xff0c;因此网络管理员必须清楚地了解、映射和查看其网络交换…

面向对象Java基础

前言 看大话设计模式的时候&#xff0c;发现自己的基础不是很扎实&#xff0c;重新回顾一些存在有点点不确定的内容&#xff0c;并从书中截取下来&#xff0c;做成笔记快速复习。 1、字段和属性 字段&#xff1a;用private修饰&#xff0c;也叫私有变量。属性&#xff1a;字…

2.Docker操作

文章目录 Docker操作Docker镜像操作搜索镜像获取镜像镜像加速下载查看镜像详细信息为镜像添加标签删除镜像导出导入镜像上传镜像 Docker容器操作创建容器查看容器状态启动容器创建并启动容器进入容器停止容器删除容器复制容器文件到宿主机容器的导出导入 Docker操作 ###查看do…