invalid comparison
问题描述
springboot项目,调用接口时,控制台报错,错误日志如下:
### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:156)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425)
... 65 common frames omitted
Caused by: java.lang.IllegalArgumentException: invalid comparison: java.time.LocalDateTime and java.lang.String
at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:79)
at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:131)
at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:703)
at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:37)
at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:171)
at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:206)
at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:45)
at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:171)
at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:206)
at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:408)
at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:383)
at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:47)
at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32)
at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34)
at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32)
at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:39)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:320)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:135)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154)
... 70 common frames omitted
问题原因
类型不匹配。LocalDateTime 是日期时间类型,而字符串(如 "")是文本类型。Java 不允许直接比较这两种类型,尤其是在数据库查询或ORM框架(如MyBatis、Hibernate)中。
本例中,报错,是因为在Mybatis的Mapper文件中存在如下的代码
<if test="startTime != null and startTime != ''">
and re.start_time >= #{startTime}
</if>
解决方案
移除无效的空字符串比较,剔除条件 and startTime != ''
<if test="startTime != null">
and re.start_time >= #{startTime}
</if>