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

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方法了. 问题也就不会出现了

相关推荐
2501_941805938 分钟前
在大阪智能零售场景中构建支付实时处理与高并发顾客行为分析平台的工程设计实践经验分享
数据库
李慕婉学姐16 分钟前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
珠海西格电力23 分钟前
零碳园区有哪些政策支持?
大数据·数据库·人工智能·物联网·能源
数据大魔方43 分钟前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
Chasing Aurora1 小时前
数据库连接+查询优化
数据库·sql·mysql·prompt·约束
倔强的石头_1 小时前
【金仓数据库】ksql 指南(六)—— 创建与管理用户和权限(KingbaseES 安全控制核心)
数据库
小熊officer2 小时前
Python字符串
开发语言·数据库·python
渐暖°2 小时前
JDBC直连ORACLE进行查询
数据库·oracle
萧曵 丶3 小时前
Next-Key Lock、记录锁、间隙锁浅谈
数据库·sql·mysql·mvcc·可重复读·幻读
做cv的小昊4 小时前
【TJU】信息检索与分析课程笔记和练习(7)数据库检索—Ei
数据库·笔记·学习·全文检索