最近项目出了一个BUG,具体情况如下:
项目使用SSM,M为加强版的MybatisPlus;
持久层Manager使用公用的实现,也就是说, 图1中,userManager和airManager这2个持久层所使用的方法getOneByWrapper走的是同样的代码流程PageHelper.startPage和dao.selectList;
产生的问题是:userManager的selectList_COUNT转化出来的SQL执行语句,和airManager的selectList_COUNT所转化出来的SQL执行语句,完全不一样,如图3及图4:
报错执行的SQL语句selectList_COUNT是:
airManager:
select count(0) from (SELECT id,air_number AS airNumber,enable,airworthiness,if_use AS ifUse,del_flag AS delFlag,create_time AS createTime,update_time AS updateTime,type,air_type AS airType,air_type_long AS airTypeLong,terminal,carrier,mainhold_count AS mainholdCount,bellyhold_count AS bellyholdCount,mainhold_name AS mainholdName,bellyhold_name_fwd AS bellyholdNameFwd,bellyhold_name_aft AS bellyholdNameAft FROM air WHERE del_flag=‘NORMAL’ AND (id = ?) ORDER BY create_time DESC) tmp_count
而userManager执行的SQL语句selectList_COUNT却是:
SELECT count(0) FROM sys_user WHERE del_flag = ‘NORMAL’ AND (id = ?)
相同的公用逻辑产生了不同的SQL执行语句,我对问题进行了一番定位,终于找到问题。
刚开始的时候,还以为是实体持久层的入库SQL描述描述文件xml出了问题,以为是描述少了一个air_number表字段而导致的,后来即使补充完整,对准顺序,问题依旧存在不变。
对反编译文件class看代码来定位问题。
整个Exception错误栈日志过程是:
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:89)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy2