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

相关推荐
TG_yunshuguoji7 分钟前
腾讯云代理商:腾讯云CloudBase数据库操作全解析
数据库·人工智能·云计算·腾讯云·cloudbase
运维行者_20 分钟前
通过Applications Manager的TCP监控确保无缝网络连接
运维·服务器·网络·数据库·人工智能
j7~29 分钟前
【MYSQL】视图--详解
数据库·mysql·视图的定义·视图的基本使用·视图的规则和限制
我是一颗柠檬40 分钟前
【Redis】主从复制Day9
java·数据库·redis·后端
Wenzar_43 分钟前
GeoHash+Redis Streams实时围栏系统实战
java·数据库·redis·junit
侯盛鑫44 分钟前
理解 RocksDB IngestExternalFile
数据库·后端
ECT-OS-JiuHuaShan1 小时前
辩证函数,渡劫代谢:时势造英雄,英雄发神经
数据库·人工智能·机器学习
Mr.朱鹏1 小时前
基于 postgres_fdw 的跨库查询方案
java·数据库·spring boot·sql·spring·postgresql
Leo.yuan1 小时前
MySQL到Hive数据同步怎么选工具?FineDataLink全链路方案实测
数据库·hive·mysql
Database_Cool_1 小时前
数据仓库物化视图是什么?阿里云 AnalyticDB MySQL 实时物化视图最佳实践
数据库·数据仓库·mysql