首页 > 其他分享 >得嘞,分页插件PageHelper返回记录总数total竟然出错了!

得嘞,分页插件PageHelper返回记录总数total竟然出错了!

时间:2024-03-20 15:45:36浏览次数:24  
标签:返回 插件 list PageHelper PageInfo total Page size

问题描述

分页返回的记录总数total和每页数量pageSize一致,数据库统计的数量大于当前返回的总记录数total,以下是相关代码

问题分析

  1. sql错误导致返回信息有误?
    检查结果:经过数据执行日志中生成的sql,sql正常并且数据总条数也正确

  2. PageHelper使用方式错误,导致数据错误
    检查结果:通过与项目中其他地方使用记录的对比,使用方式正确

  3. 返回结果后有中间处理导致总数减少
    检查结果:网上有人遇到 对返回结果有类型转化导致total错误的情况, 以此类推,发现当前代码虽没有对返回结果进行类型转换但是对mapper返回的结果更换了实例对象然后将更换后的对象包装,

    进一步查看包装成PageInfo<T>时源码并没有关于total参数的处理,

    PageInfo<T>构造方法

    public class PageInfo<T> extends PageSerializable<T> {
    /**
     * 包装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) {
            this.navigatePages = navigatePages;
            //计算导航页
            calcNavigatepageNums();
            //计算前后页,第一页,最后一页
            calcPage();
            //判断页面边界
            judgePageBoudary();
        }
    }
    }
    

    继续查看父类PageSerializable,发现有关于total参数的处理,即mapper返回的list不是Page的实例时total会被设置为返回list的size大小

    PageSerializable构造方法

    public PageSerializable(List<T> list) {
        this.list = list;
        if(list instanceof Page){
            this.total = ((Page)list).getTotal();
        } else {
            this.total = list.size();
        }
    }
    

    进一步debug,发现返回list确实不是Page类的实例,故推断出这一结果是由于对mapper返回list结果更换了实例对象导致的,

    再次确认mapper返回结果,是Page的实例

解决方案

使用mapper返回的对象直接构造PageInfo对象,并在此基础上获取分页信息

更正的代码如下:

最佳实践

在使用 PageInfo<T> pageInfo = new PageInfo<>(T); 构造PageInfo时直接使用mapper 返回对象,不要进行类型转换或转存等操作,以免丢失数据。

标签:返回,插件,list,PageHelper,PageInfo,total,Page,size
From: https://www.cnblogs.com/Jcloud/p/18085376

相关文章

  • Photoshop2024(PS)和Lightroom(LR)设计的智能磨皮插件Portraiture下载
     打造完美肤质,PortraiturePS/LR专用智能磨皮插件让你的照片焕发魅力副标题:让你的照片告别粗糙皮肤和毛孔,展现自然细腻的肤质在摄影后期处理中,给照片进行磨皮和肤质优化是一项必不可少的步骤。而今天,我们为你带来了一款专为Photoshop(PS)和Lightroom(LR)设计的智能磨皮插件——......
  • 打造专业人像照片的必备神器Portraiture2024免费PS/LR专用智能磨皮插件
    在摄影后期处理中,人像照片的磨皮处理是一项必不可少的技能。今天,我们为大家带来了一款专为Photoshop(PS)和Lightroom(LR)设计的智能磨皮插件——Portraiture。这款插件凭借其出色的表现和便捷的操作,深受广大摄影爱好者和专业摄影师的喜爱。接下来,让我们一起探索Portraiture的魅力......
  • 各大OJ的插件(篡改猴)
    声明:我用的360,也不知道别的浏览器能不能用篡改猴下载?link进入页面后点击下载处黑色小猴子的去商店右边的灰色按钮然后启动下载的东西剩下的自己看着办洛谷smart-lougulink美化LuoguTaskslink在洛谷侧边栏显示题单与自己存的题LuoguSearchAnyWherelink在页面右......
  • Apache Jmeter常用插件下载及安装及软硬件性能指标
    一、安装插件管理器1)、进入Install::JMeter-Plugins.org 下载 plugins-manager.jar2)、将 plugins-manager.jar 放到  "…\apache-jmeter-5.5\lib\ext"  目录下3)、重启ApacheJMeter4)、菜单栏上点击“选项”会多出一个“PluginsManager”的按钮,点击......
  • 插件下载(成为开发者编写自己的动态DLL插件/请下载以下dll插件移动到[xl0shell-aptv2目
    DLL动态库插件下载地址支持平台上传时间功能介绍多IP域名穷举插件.dll点击下载xl0shell-aptv2工具库2024/03/1618:54:22可进行多IP域名直接爆出的插件工具,可进行IP下域名扫描等操作生成TXT文本到桌面webshell批量管理工具插件.dll点击下载xl0shell......
  • TP6 使用 nusoap为第三方webservice调用插件
    composer下载插件composerrequirenusoap/nusoapuseNuSoap\Client\Client;classIndexextendsBaseController{/****/publicfunctionindex(){//WebService的WSDL地址$wsdl='http://xxx.ygys.net/ResumeServ......
  • 【20.1】Django框架Form组件之常用字段及插件
    【零】引入创建Form类时主要涉及到【字段】和【插件】字段用于对用户请求数据的验证插件用于自动生成HTML;【一】Field.clean(value)注意:这里说的是字段Field的clearn方法,不是表单Form的clean方法。虽然表单字段的Field类主要使用在Form类中,但也可以直接实例化它们来......
  • 【16.0】JS确认插件补充
    【一】SweetAlert【一】介绍SweetAlert是一个基于JavaScript的弹窗插件,用于创建美观而且高度可定制的弹窗效果。SweetAlert提供了多种弹窗风格和动画效果,可以用于警告、确认、提示和错误等不同的场景。【二】特点(1)美观可定制SweetAlert提供了漂亮和精心设计的弹窗样......
  • Eplan插件 - 修改全局栅格
    前言在工作中,经常使用到窗口宏,尤其是在驱动器比较多的时候,可能一连几十页都是伺服驱动器,但是由于窗口宏是从其他地方获取而来。而窗口宏的制作者使用了过大或过小的栅格就会出现画图连接不齐的情况,那么就需要手动修改栅格的大小。在Eplan中默认修改的是当前页面的栅格。在页数很......
  • My97DatePicker日期插件WdatePicker.js的使用方法
    原文链接:https://blog.csdn.net/honghailiang888/article/details/51384929一、先来最简单的配置方法:(1)下载WdatePicker.js(包括lang和skin文件夹)。(2)在html页面中导入WdatePicker.js。//同时引入了WdatePicker.css文件(3)在输入框input元素上加入class="Wdate"onFocus="WdatePic......