异常SQL:
这个项目中一个统计周度数据的SQL,直接在数据库中查询无任何问题,但MyBatisPlus却无法通过SqlParser完成解析,语句简化后如下:
SELECT xxx FROM
(SELECT yyy FROM a
WHERE create_time >= date_sub(CURDATE(), INTERVAL #{span} WEEK)
GROUP BY zzz
) AS b
运行时报错:
...MybatisPlusException: Failed to process, please exclude the tableName or statementId.
这个报错的原因是:
使用了自定义SQL,可能含有特殊的函数或者复杂的语法,因而不被JSqlParser(SQL解析器)所支持(无法添加租户id之类的字段),以致抛出了JSQLParserException。
具体可以参考:解决MyBatisPlus报错:Failed to process, please exclude the tableName or statementId
出错点为:net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "CURDATE" <S_IDENTIFIER>,这样的报错让我很纳闷,因为项目中其它几乎相同的SQL,都可以正常运行,所以确定不是CURDATE的锅,如月度统计和每日统计,仅有一词一差:
-- 每日
SELECT xxx FROM
(SELECT yyy FROM a
WHERE create_time >= date_sub(CURDATE(), INTERVAL #{span} DAY)
GROUP BY zzz
) AS b
-- 月度
SELECT xxx FROM
(SELECT yyy FROM a
WHERE create_time >= date_sub(CURDATE(), INTERVAL #{span} MONTH)
GROUP BY zzz
) AS b
分析了语法,确定语法没问题。只要关闭SqlParser解析,或者替换掉WEEK就可以正常运行。那么就基本确定是SqlParser对WEEK的解析出了问题,属于该包的一个bug(尝试使用了最新的SqlParser的包,但依旧解决)。
解决方案:
#{span} WEEK 改成 (#{span} * 7) DAY
暂时只能这样将就一下
坐等官方处理issue
探讨了在MyBatisPlus中使用特定SQL语法进行周度数据统计时遇到的解析错误,并提供了解决方案,即将#{span}
1466





