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。
具体可以参考:解决MyBatisPlus报错:Failed to process, please exclude the tableName or statementId

出错点为:net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "CURDATE" 这样的报错让我很纳闷,因为项目中其它几乎相同的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就可以正常运行。那么就基本确定是SqlParserWEEK的解析出了问题,属于该包的一个bug(尝试使用了最新的SqlParser的包,但依旧解决)。

解决方案:

#{span} WEEK 改成 (#{span} * 7) DAY

暂时只能这样将就一下
坐等官方处理issue

你可能感兴趣的:(基本技巧,mybatis,plus,JSqlParser)