异常信息
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.NumberFormatException: For input string: "C"
### Cause: java.lang.NumberFormatException: For input string: "C"
报错代码
<if test="orderType == 'C' and orderStatus != '101' and orderStatus != '102'">
...
</if>
异常分析
MyBatis 中使用 OGNL(Object-Graph Navigation Language)表达式对动态 SQL 中的条件进行判断。这个错误通常是由于 OGNL 表达式解析字符串时类型不匹配导致的,那么为什么单个字符’C’会报类型不匹配呢?多个字符的’101’不报错呢?
问题原因就在于单引号包裹的单字符(如 ‘C’)会被解析为 char 类型,而 char 无法直接与字符串比较。双引号包裹的字符(如 “C”)或单引号包裹的多字符(如 ‘CC’)会被解析为 String 类型。
解决办法
方案1:
将整个条件判断中的代码用单引号包裹,里面的字符串,不管单个字符还是多个字符均用双引号包裹,修改如下:
<if test='orderType == "C" and orderStatus != "101" and orderStatus != "102"'>
...
</if>
方案2:
如果坚持用单引号包裹单个字符串’C’,那么需要调用toString()方法显式将 char 类型转换成String类型,修改如下:
<if test="orderType == 'C'.toString() and orderStatus != '101' and orderStatus != '102'">
...
</if>
不管是方案1还是方案2,目标都是确保比较双方的数据类型一致。
9066

被折叠的 条评论
为什么被折叠?



