PageHelp插件在复杂sql下引起的Having无法识别错误及其解决方案

2023-09-22 09:20:08

1: 问题出现的场景

系统中有一个复杂SQL内嵌套了多个子查询.在改动时需要将SQL的最后一行加上having来做额外的过滤处理. 添加完having语句后发现SQL能够正常执行就直接将代码提交到了测试环境.结果在测试环境报错Unknown column ‘xxx‘ in ‘having clause. 

2: 分析问题

1:  经过日志获取SQL发现出现了两条SQL.  其中一条SQL 是  SELECT  count( 0 ) FROM  xxx;

这条sql是  PageHelp插件在开启分页后自动生成的获取总数的语句. 问题就是出现在这条SQL上.

2: 简化后的正常sql如下.

pageHelp生成的sql如下

两者对比就发现. pageHelp生成的sql没有生成最后一个大括号.而是直接用了原sql最后一个大括号来当做结束.这个明显是有问题的.

因为pageHelp正常情况下生成的统计sql会以 ) tmp_count  结尾.

这个时候有读者开始问了. 这个异常sql也能正常执行啊.顶多就是分页数据统计不准确罢了. 

没错.此时sql确实能正常执行. 但是加上having语句后就变了.

加上这条Having后.在执行sql就会发现报错了. 因为mysql此时无法识别该语法了. 这也是为什么我们系统之前用了很长时间都没有出现错误.而加上having后就会报错了. 

3:问题原因及解决办法

此时发现问题根源并不是havging导致的.而是原本就pageHelp插件在复杂的sql情况下原本就存在解析错误.而having只是压断它的最后一根稻草罢了.

发现问题了就该解决问题了.

解决方法: 通过重写mybatis方法来阻止pageHelp生成的sql.

在原sql的id后面加上 _COUNT 就能重写该方法了.

此时在执行分页查询的时候.就不会走pageHelp的SQL,而是重写的这个sql方法了. 问题也就不会出现了

更多推荐

南大通用数据库-Gbase-8a-学习-39-show命令汇总(持续更新)

目录一、环境信息二、show功能参数三、show命令示例1、SHOWLOADLOGS(加载日志报错)2、SHOWCOLUMNS(列信息)3、SHOWCREATEDATABASE(建库信息)4、SHOWCREATEPROCEDURE(存储过程信息)5、SHOWCREATETABLE(建表信息)6、SHOWTABLELOC

中国核动力研究设计院使用 DolphinDB 替换 MySQL 实时监控仪表

随着仪表测点的大幅增多和采样频率的增加,中国核动力研究设计院仪控团队原本基于MySQL搭建的旧系统已经无法满足大量数据并发写入、实时查询和聚合计算的需求。他们在研究DB-Engines时序数据库榜单时了解到国内排名第一的DolphinDB。经过测试,发现其非常符合业务需求,并且在2022年1月正式选择了DolphinD

2023年全国研究生数学建模竞赛华为杯C题大规模创新类竞赛评审方案研究

2023年全国研究生数学建模竞赛华为杯C题大规模创新类竞赛评审方案研究原题再现:现在创新类竞赛很多,其中规模较大的竞赛,一般采用两阶段(网评、现场评审)或三阶段(网评、现场评审和答辩)评审。创新类竞赛的特点是没有标准答案,需要评审专家根据命题人(组)提出的评审框架(建议)独立评审。所以,对同一份作品,不同评委的评分可能

MySQL 开源证书真比 Postgres 更能带动社区吗?

笔者之前写的「全方位对比Postgres和MySQL」还在持续发酵,最近腾讯的公众号也发布了一篇「MySQLVSPostgreSQL,谁是世界上最成功的数据库?」,其中在对比两者使用的开源证书时写到:PostgreSQLLicense是一个宽松的开源许可证,类似于MIT许可证。它允许用户自由使用、修改和分发,无需公开源

go迷之切片截取分析

切片截取,有没有很迷?目录典型截取(两参数、三参数)及分析迷之append参与截取及细节分析关于截取时的初始索引是否从第一个位置开始的影响修改原切片细节分析典型截取(两参数、三参数)及分析先看一个例子来表示一下切片截取(仅截取,无append):a:=[]int{1,2}a0:=a[0:1]fmt.Printf("a0

UI设计和平面设计的区别是什么?看完这篇一次搞懂

很多想要从事视觉领域工作的新手设计师,搞不懂UI设计和平面设计的区别;也有很多平面设计师工作后想转UI,却不知道该如何进行,导致择业和职业发展受阻,其实核心问题还是因为没有弄清楚UI设计和平面设计的区别是什么。这里先说明,UI设计和平面设计,是两个完全不同的设计领域。UI设计师着重于解决产品的用户习惯和易用体验,而平面

07JVM_内存模型和CAS与原子类

一、内存模型1.java内存模型Java内存结构是JMM(JavaMemoryModel)的意思。JMM定义了一套在多线程读写共享数据(成员变量,数组)时,对数据的原子性,见性,有序性的规则和保障。1.1原子性什么是原子性?原子性是指一个操作是不可中断的,即使多个线程一起执行,一个线程一旦开始,就不会被其他线程干扰。如

Django系列:Django开发环境配置与第一个Django项目

Django系列Django开发环境配置与第一个Django项目作者:李俊才(jcLee95):https://blog.csdn.net/qq_28550263邮箱:291148484@163.com本文地址:https://blog.csdn.net/qq_28550263/article/details/1328

自动化测试—选择器

根据id选择名字:<inputtype="text"id='searchtext'/>element=wd.find_element(By.CSS_SELECTOR,'#searchtext')element.send_keys('你好')根据class选择元素的两种方式:1.By.CLASS_NAME:element

form组件的封装(element ui ) 简单版本

当你使用Vue.js构建Web应用时,封装可复用组件是提高开发效率和代码可维护性的关键之一。在这篇文章中,我们将探讨如何使用Vue.js来创建一个通用的表单组件,以及如何将它封装成一个可配置的组件。实现思路拿下表单模板一个个的改造(文本,下拉,单选,复选等)按钮默认值的设定rules规则的处理创建通用的form组件这段

Arm机密计算架构技术(Armv9 CCA) 白皮书

1.概述在本篇文章中,我们将介绍机密计算(ConfidentialComputing)在现代计算平台中扮演的角色,并解释机密计算的原理。然后我们将说明Arm机密计算架构(ArmCCA)如何在Arm计算平台中实现机密计算。看完本文后,您将能够:定义机密计算描述复杂的系统信任链了解Realm(机密领域)是由ArmCCA引入

热文推荐