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

  • 相关阅读:
    git实操gitee
    CSS 选择器Day01
    Flutter高仿微信-第42篇-创建群
    Spring Cloud根据服务名获取服务的ip端口
    探索抽象同步队列 AQS
    查找算法之二分查找
    【Mycat2实战】四、Mycat实现分库分表【概念篇】
    【微软】【ICLR 2022】TAPEX:通过学习神经 SQL 执行器进行表预训练
    【框架】Flask
    C++ Visual Studio 2022 中的改进、行为更改和错误修复
  • 原文地址:https://blog.csdn.net/wang5701071/article/details/133141522