Mybatis运行报错:Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

报错如下:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446) ~[mybatis-spring-1.3.1.jar!/:1.3.1]
        at com.sun.proxy.$Proxy163.selectList(Unknown Source) ~[?:?]
        at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:230) ~[mybatis-spring-1.3.1.jar!/:1.3.1]
        at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137) ~[mybatis-3.4.0.jar!/:3.4.0]
		......
		......
		......
        at java.lang.Thread.run(Thread.java:745) [?:1.8.0_101]
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.4.0.jar!/:3.4.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150) ~[mybatis-3.4.0.jar!/:3.4.0]
        at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141) ~[mybatis-3.4.0.jar!/:3.4.0]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_101]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_101]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_101]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_101]
        at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433) ~[mybatis-spring-1.3.1.jar!/:1.3.1]
        ... 110 more

问题原因:
我的Mybatis中的日期查询写法:

<if test="startDate != null and startDate !=''">
	AND MY_Date >= #{startDate,jdbcType=TIMESTAMP}
</if>
<if test="endDate != null and endDate !=''">
	AND MY_Date <= #{endDate,jdbcType=TIMESTAMP}
</if>

看着也没什么问题,但是实际执行报错如上面所示。

原因在于我的入参Condition中的日期类型定义的是Date,并非String,如果是Date类型,那么Mybatis中判断为空不能使用startDate !=”,用了就要把Date类型转为String类型,此时就报错了。

所以需改后的Mybatis代码如下:

<if test="startDate != null ">
	AND MY_Date >= #{startDate,jdbcType=TIMESTAMP}
</if>
<if test="endDate != null ">
	AND MY_Date <= #{endDate,jdbcType=TIMESTAMP}
</if>