彻底解决ruoyi分页后总数错误的问题
问题描述
最近时不时的发现用户列表出来的数据只有24条,但是总记录数却有58条,很奇怪。各种百度查询,都是什么修改查询分页改代码,尝试后发现还是没有效果,经过各种验证发现就是SQL语句错误。
如果非要说是SQL语句没有问题,查询出来的数据是正确的,如果基于这个事实去讲那确实没有错,错的是你建表的字段类型不一致,这是本质错误。举个例子,你的主表user中有一个dept_id的字段,而这个字段是varchar(200),但是你的dept表的id确实bigint的类型,这个时候就会出现你用具体的字段去查询是正确的结果数据,但是用count(*) 去查询就是错误的记录数。
解决方法前提
先把PageUtils.java替换成和我一样的。避免出现其它的幺蛾子。
package com.ruoyi.common.utils;import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.page.TableSupport;
import com.ruoyi.common.utils.sql.SqlUtil;import java.util.List;/*** 分页工具类** @author ruoyi*/
public class PageUtils extends PageHelper {private static Page page;/*** 设置请求分页数据*/public static void startPage() {PageDomain pageDomain = TableSupport.buildPageRequest();Integer pageNum = pageDomain.getPageNum();Integer pageSize = pageDomain.getPageSize();if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());Boolean reasonable = pageDomain.getReasonable();PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);}}public static TableDataInfo getDataTable(List<?> list) {TableDataInfo rspData = new TableDataInfo();rspData.setCode(HttpStatus.SUCCESS);rspData.setMsg("查询成功");rspData.setRows(list);rspData.setTotal(page.getTotal());return rspData;}
}
解决方法1
把两张表的字段类型对应成一样的。如果有一个是bigint,有一个是varchar要么都统一修改为varchar要么统一修改为bigint。
解决访问2
字段不用修改,修改SQL语句,把bigint的字段转换一下,如下
// 错误的写法
select count(0)from user uleft join dept d on d.id=u.dept_idwhere 1=1and u.is_deleted = 0// 正确的写法
select count(0)from user uleft join dept d on concat(d.id,'')=u.dept_idwhere 1=1and u.is_deleted = 0// 正确的写法
select count(0)from user uleft join dept d on cast( d.id AS CHAR )=u.dept_idwhere 1=1and u.is_deleted = 0
警告
切记,不要让没有经验的人去设计表结构,我这次就是为了100%兼容V1版本的设计,用ruoyi框架去做的倾斜匹配,导致各种问题。
------------------------------华丽的分割线--------
无用解决方案
以下都是没有用的解决方案,大家不用看了,修改你的SQL语句去吧。下面的都是凑字数的。
分页插件如何手写count查询支持
增加countSuffix count 查询后缀配置参数,该参数是针对PageInterceptor配置的,默认值为_COUNT。
分页插件会优先通过当前查询的msId + countSuffix查找手写的分页查询。
如果存在就使用手写的count查询,如果不存在,仍然使用之前的方式自动创建count查询。
例如,如果存在下面两个查询:
<select id="selectLeftjoin" resultType="com.github.pagehelper.model.User">select a.id,b.name,a.py from user aleft join user b on a.id = b.idorder by a.id
</select><select id="selectLeftjoin_COUNT" resultType="Long">select count(distinct a.id) from user aleft join user b on a.id = b.id
</select>
上面的countSuffix使用的默认值_COUNT,分页插件会自动获取到selectLeftjoin_COUNT查询,这个查询需要自己保证结果数正确。
返回值的类型必须是resultType="Long",入参使用的和selectLeftjoin查询相同的参数,所以在SQL中要按照selectLeftjoin的入参来使用。
因为selectLeftjoin_COUNT方法是自动调用的,所以不需要在接口提供相应的方法,如果需要单独调用,也可以提供。
如何处理Long类型精度丢失问题
当字段实体类为Long类型且值超过前端js显示的长度范围时会导致前端回显错误,解决方案如下
1、使用JsonSerialize注解序列化的时候把Long自动转为String(针对单个属性)
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;@JsonSerialize(using = ToStringSerializer.class)
private Long xxx;
2、添加JacksonConfig配置全局序列化(针对所有属性)
package com.ruoyi.framework.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;/*** Jackson配置* * @author ruoyi**/
@Configuration
public class JacksonConfig
{@Beanpublic MappingJackson2HttpMessageConverter jackson2HttpMessageConverter(){final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();builder.serializationInclusion(JsonInclude.Include.NON_NULL);final ObjectMapper objectMapper = builder.build();SimpleModule simpleModule = new SimpleModule();// Long 转为 String 防止 js 丢失精度simpleModule.addSerializer(Long.class, ToStringSerializer.instance);objectMapper.registerModule(simpleModule);// 忽略 transient 关键词属性objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);// 时区设置objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));return new MappingJackson2HttpMessageConverter(objectMapper);}
}相关文章:
彻底解决ruoyi分页后总数错误的问题
问题描述 最近时不时的发现用户列表出来的数据只有24条,但是总记录数却有58条,很奇怪。各种百度查询,都是什么修改查询分页改代码,尝试后发现还是没有效果,经过各种验证发现就是SQL语句错误。 如果非要说是SQL语句没…...
SpringMVC学习笔记——1
SpringMVC学习笔记——1 一、SpringMVC简介1.1、SpringMVC概述1.2、SpringMVC快速入门1.3、Controller中访问容器中的Bean1.4、SpringMVC关键组件的浅析 二、SpringMVC的请求处理2.1、请求映射路径配置2.2、请求数据的接收2.2.1、键值对方式接收数据2.2.2、封装JavaBean数据2.2…...
20230908_python练习_selenium模块爬取网页小说练习
霍比特人小说爬取,使用 selenium 模块调用谷歌浏览器,无界面模式爬取小说网站信息,将数据按照每次2000字符在mysql中保存。 # https://www.shukuai9.com/b/324694/ # 导入需要的库 from selenium import webdriver # 导入Keys模块ÿ…...
Python:安装Flask web框架hello world示例
安装easy_install pip install distribute 安装pip easy_install pip 安装 virtualenv pip install virtualenv 激活Flask pip install Flask 创建web页面demo.py from flask import Flask app Flask(__name__)app.route(/) def hello_world():return Hello World! 2023if _…...
深度解析NLP文本摘要技术:定义、应用与PyTorch实战
目录 1. 概述1.1 什么是文本摘要?1.2 为什么需要文本摘要? 2. 发展历程2.1 早期技术2.2 统计方法的崛起2.3 深度学习的应用2.4 文本摘要的演变趋势 3. 主要任务3.1 单文档摘要3.2 多文档摘要3.3 信息性摘要 vs. 背景摘要3.4 实时摘要 4. 主要类型4.1 抽取…...
zabbix监控多实例redis
Zabbix监控多实例Redis 软件名称软件版本Zabbix Server6.0.17Zabbix Agent5.4.1Redis6.2.10 Zabbix客户端配置 编辑自动发现脚本 vim /usr/local/zabbix/scripts/redis_discovery.sh #!/bin/bash #Fucation:redis low-level discovery #Script_name redis_discovery.sh red…...
win11将visual studio 2022的调试控制台改为windows terminal
一、前言 默认的调试控制台太丑了,字体也没有好看的,还是更喜欢windows terminal 二、修改 2.1 修改之前 2.2 修改步骤 打开windows terminal点这个向下的标志 选择settings按照下图1, 2, 3步骤依次操作即可 2.3 修改之后 总结 漂亮很多了...
社区问答精选——长安链开发知多少?(8月)
本文是根据社群内开发者较为关注的问题进行整理,希望可以帮助开发者解决所遇到的问题。有更多问答在社区issue中描述更为细致,开发者提问前可以先按照关键词进行搜索。欢迎各位开发者按照问答template提交issue,也欢迎有意愿的开发者参与到社…...
神经网络-Unet网络
文章目录 前言1.seq2seq 编码后解码2. 网络结构3.特征融合4. 前言 Unet用来做小目标语义分割。 优点:网络结构非常简单。 大纲目录 2016年特别火,在细胞领域做分割特别好。 1.seq2seq 编码后解码 2. 网络结构 几个卷积层,越来越扁&#x…...
Java | 多线程综合练习
不爱生姜不吃醋⭐️ 如果本文有什么错误的话欢迎在评论区中指正 与其明天开始,不如现在行动! 文章目录 🌴前言🌴一、卖电影票1.题目2.分析3.代码 🌴二、送礼物1. 题目2. 分析3.代码 🌴三.打印奇数1. 题目2.…...
Kotlin变量与控制条件的基本用法
一、变量与控制条件 1、var与val var:可修改变量 val:只读变量,只读变量并非绝对只读。 编译时常量只能在函数之外定义,因为函数内常量是在运行时赋值,编译时常量要在变量赋值前存在。并且值是无法修改的。 const…...
第18章_瑞萨MCU零基础入门系列教程之GPT
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...
openssl websockets
1. HTTPS通信的C实现 - 知乎 GitHub - Bwar/Nebula: Nebula is a powerful framwork for building highly concurrent, distributed, and resilient message-driven applications for C....
Vue 组件的单元测试
1、基本的示例 单元测试是软件开发非常基础的一部分。单元测试会封闭执行最小化单元的代码,使得添加新功能和追踪问题更容易。Vue 的单文件组件使得为组件撰写隔离的单元测试这件事更加直接。它会让你更有信心地开发新特性而不破坏现有的实现,并帮助其他…...
海底两万里的思维导图,轻松了解整体的内容
《海底两万里》是一部经典的科幻小说。小说以其丰富的想象力和对海底世界的描绘而闻名于世。今天我们就用思维导图的分支介绍这个作品到底讲了什么。(思维导图示例:迅捷画板) 《海底两万里》是“凡尔纳三部曲”中的第二部(其它两部…...
ZABBIX 6.4官方安装文档
一、官网地址 Zabbix:企业级开源监控解决方案 二、下载 1.选择您Zabbix服务器的平台 2. Install and configure Zabbix for your platform a. Install Zabbix repository # rpm -Uvh https://repo.zabbix.com/zabbix/6.4/rhel/8/x86_64/zabbix-release-6.4-1.el8…...
本地MQTT服务器搭建(EMQX)
一、下载EMQX 下载地址:EMQ (emqx.com) 打开官网后,选择右边的免费试用按钮 然后单击EMQX Enterprise标签,然后选择下面的EMQX开源版,选择开源版的系统平台为Windows,单击免费下载。 在新页面下单击立即下载 二、安装…...
Docker启动pandora并指定ACCESS TOKEN
把chatGPT_ACCESS_TOKEN改成你的ACCESS_TOKEN 《chatGPT ACCESS TOKEN获取地址(需要魔法)》 docker run -d -m 512m -p 88:88 --privilegedtrue -e PANDORA_SERVER0.0.0.0:88 -e PANDORA_ACCESS_TOKENchatGPT_ACCESS_TOKEN --name pandora pengzhile/pa…...
Python + Jmeter 实现自动化性能压测
Step01: Python脚本开发 文件路径:D://wl//testproject//Fone-grpc//project1//test_client.py Python 脚本作用: 通过 grpc 调用底层 c 的接口,做数据库的数据插入与查询操作,然后将返回的结果进行拼接与输出。 2.代码里面将…...
【Linux进行时】进程状态
进程状态: ❓假设我们在上课,在B站上上课,请问我们的B站是不是一直运行呢?💡不是的! ❓假设我们同时打开了B站和PDF阅读器时,是怎么运行的呢? 💡每一个进程在CPU跑一会&a…...
pyqt使用QChartView绘制饼状图详解(QPieSeries)
pyqt使用QChartView绘制柱状图一、工程搭建二、QPieSeries详解1、核心概念2、主要功能和方法2.1、QPieSeries 的常用方法2.2、QPieSlice 的常用属性和方法3、关键点解释4、常见问题二、代码示例1、示例代码2、效果展示一、工程搭建 pyqt6QtCharts模块需要单独安装,…...
6_Harness驾驭工程可靠性层:混沌工程与服务可靠性管理
6_Harness驾驭工程可靠性层:混沌工程与服务可靠性管理 关键字: Chaos Engineering、混沌工程、SRM、服务可靠性管理、SLI、SLO、错误预算、韧性评分、故障模拟、事件响应、事后分析、韧性验证、自动故障注入、最小爆炸半径、Datadog、New Relic、Prometh…...
跨平台终端工具cmatrix:打造震撼的数字雨可视化效果
跨平台终端工具cmatrix:打造震撼的数字雨可视化效果 【免费下载链接】cmatrix Terminal based "The Matrix" like implementation 项目地址: https://gitcode.com/gh_mirrors/cm/cmatrix 你是否曾幻想过在自己的终端中重现《黑客帝国》里令人着迷的…...
3步实现手游PC级操控:QtScrcpy键鼠映射技术全解析
3步实现手游PC级操控:QtScrcpy键鼠映射技术全解析 【免费下载链接】QtScrcpy Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...
省token秘籍:OpenClaw+nanobot镜像长文本处理优化方案
省token秘籍:OpenClawnanobot镜像长文本处理优化方案 1. 当长文本遇上大模型:我的token焦虑症 第一次尝试用OpenClaw处理公司三年的技术文档归档时,我看着账单倒吸一口凉气——单次50万token的消耗让我的个人预算瞬间见底。这促使我开始探索…...
PEI转染试剂及相关工具在生命科学研究中的应用解析【曼博生物官方代理Polysciences】
摘要:聚乙烯亚胺(PEI)转染试剂在基因递送、病毒载体生产等领域应用广泛。本文结合Polysciences相关产品体系,对PEI转染、微球技术及神经示踪染料等工具进行系统梳理。 关键词:PEI转染、聚乙烯亚胺、基因转染、HEK293、…...
从零部署RK3588 MPP:硬编解码环境搭建与核心工具解析
1. RK3588 MPP硬编解码环境搭建全流程 第一次在ArmSoM-W3开发板上折腾RK3588的MPP硬编解码环境时,我踩了不少坑。这里把完整搭建过程拆解成可复现的步骤,用最直白的语言分享给各位开发者朋友。 MPP(Media Process Platform)是瑞芯…...
Cartool实战:手把手教你完成静息态EEG微状态分析的组水平聚类与模板匹配
Cartool实战:静息态EEG微状态分析全流程解析与避坑指南 在认知神经科学研究中,静息态EEG微状态分析正成为探索大脑动态功能网络的重要工具。不同于传统频域分析,微状态分析通过捕捉毫秒级地形图变化,揭示大脑信息处理的离散状态转…...
雨课堂运动与健康网课高效学习指南
1. 雨课堂运动与健康网课学习资源整合 第一次接触雨课堂的运动与健康网课时,我和很多同学一样手忙脚乱。平台上的资料分散在各个角落,视频、文档、测试题混在一起,根本不知道从哪里开始。后来摸索出一套资源整理方法,效率直接翻倍…...
从电源到复位:深入拆解STM32最小系统每个电路模块的设计考量与选型避坑
从电源到复位:深入拆解STM32最小系统每个电路模块的设计考量与选型避坑 在嵌入式系统开发中,STM32系列微控制器因其出色的性能和丰富的外设资源而广受欢迎。然而,即使是看似简单的STM32最小系统设计,也蕴含着大量值得深入探讨的工…...
