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" <S_IDENTIFIER>这样的报错让我很纳闷,因为项目中其它几乎相同的SQL,都可以正常运行,所以确定不是CURDATE的锅,如月度统计和每日统计,仅有一词一差:

-- 每日
SELECT xxx FROM
	(SELECT yyy FROM a
		WHERE create_time &gt;= date_sub(CURDATE(), INTERVAL #{span} DAY)
		GROUP BY zzz
	) AS b
-- 月度
SELECT xxx FROM
	(SELECT yyy FROM a
		WHERE create_time &gt;= date_sub(CURDATE(), INTERVAL #{span} MONTH)
		GROUP BY zzz
	) AS b

分析了语法,确定语法没问题。只要关闭SqlParser解析,或者替换掉WEEK就可以正常运行。那么就基本确定是SqlParserWEEK的解析出了问题,属于该包的一个bug(尝试使用了最新的SqlParser的包,但依旧解决)。

解决方案:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值