Druid中 SQL包含INTERVAL 会直接抛异常 token INTERVAL

查询近一个月总数sql,mapper如下:
<select id="countMonthExp" parameterType="com.hky.domain.Experience"
resultType="java.lang.Integer">
select
COUNT(1)
from TB_EXPERIENCE exp
where exp.creatdate>DATE_SUB(CURDATE(), interval 1 MONTH)
and exp.cstatus = 1
</select>

报错信息如下:

dastudy- 2021-03-22 17:30:29 [http-nio-8000-exec-5] ERROR c.a.druid.filter.stat.StatFilter - merge sql error, dbType com.alibaba.druid.pool.DruidDataSource, druid-1.1.22, sql : select
        COUNT(1) res
        from TB_EXPERIENCE exp
        where exp.creatdate>DATE_SUB(CURDATE(), interval 1 MONTH)
        and exp.cstatus = 1
com.alibaba.druid.sql.parser.ParserException: TODO. pos 97, line 4, column 43, token INTERVAL

如果interval加反单引号,依旧会报错,提示sql错了。

换种写法传个值过来,可以解决,但是想知道如果想要用这个关键字,要怎么做呢?

看报错是 Duird 的 StatFilter - merge sql 时出错了,可以在配置里把 statFilter 的 mergeSql 功能关掉, 参考官方文档:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter

其中的 【4. SQL合并配置】 部分介绍:

<bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
	<property name="mergeSql" value="false" />
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
	init-method="init" destroy-method="close">
	... ...
	<property name="proxyFilters">
		<list>
			<ref bean="stat-filter" />
		</list>
	</property>
</bean>

 

在mybatis中 ">" 是属于特殊字符的,需要转义一下,可以使用 &gt; 来表示>

SELECT COUNT(*)
FROM X AS t1
WHERE X.start_time > DATE_SUB(CURDATE(),INTERVAL 6 MONTH)

我对比了你的写法,写法没问题,考虑可能是你MySQL版本的问题。

你说的传值是CURDATE()吗?如果是的话换成NOW()试试。