mybatis ONGL表达式
<!-- <if test=" "></if>标签的使用实例-->
<select id="findActiveBlogWithTitleLike" resultType="Blog">
SELECT
*
FROM
BLOG
WHERE
state = ‘ACTIVE’
<if test="title != null">
AND title like #{title,jdbcType=VARCHAR}
</if>
</select>
问题:BusinessLine为 Enum(枚举类型)
以下代码在mybatis 3.23 运行没有问题,而升级到mybatis 3.4.1 运行异常。
解决方案
错误日志:
Caused by: java.lang.IllegalArgumentException: invalid comparison: BusinessLine and java.lang.String at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:93) at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:143) at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:802) at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:53) at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61) at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:494) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:458) at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44) 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.apply(MixedSqlNode.java:33) at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55) at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41) at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:134) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) ... 30 more
总结:因为开发不规范导致的问题,因为本身判断 != null
就不应该再判断 !=''
- 开发不规范,使用 BusinessLine和 String 做比较,这个本身就是有问题的, 类似的还有用 String 比较集合或者对象;
- MyBatis 3.3 之前的 bug 导致在比较不同类型的时候,本来应该抛出的异常没有被抛出,导致这个问题被隐藏
源码分析:
根据错误代码提示解析源码
at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:93)
mybatis 3.23
mybatis 3.4.1