MyBatisPlus解析WEEK关键字出现异常的踩坑记录
异常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。 具体可以参考:
出错点为: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