mybatis 报错:Cause: java.lang.NumberFormatException: For input string: "Y"
最近在使用SSM框架时遇到一个问题,通过排查可以发现问题出现在一句mybatis的 if 查询条件,但从代码逻辑始终没有发现任何问题,反复验证之后确定应该是代码在转换解析时异常。
出错的代码很简单:
1 <select resultMap="BaseResultMap" parameterType="HashMap"> 2 select 3 * 4 from userinfo 5 <where> 6 <if test="flag != null and flag == 'Y'"> <!--这里报错NumberFormatException--> 7 AND flag = 'Y' 8 </if> 9 </where> 10 </select>
问题的原因在于mybiatis是基于OGNL语法,在解析单引号+单字符 'Y' 的解析时会默认时char类型,单引号+多字符 'AA' 或者双引号+单字符 "A" 解析为String类型。
所以上面的报错也很好理解了, NumberFormatException 在将字符转换成数字时报错。
大概思路就是通过转换编码,使单字符能够被正确解析。
1 <if test='flag != null and flag == "Y"'><!--单双引号互换位置--> 2 <if test="flag != null and flag eq 'Y'.toString()"><!--通过toString方法转换,eq与双等号相同功能,可替换--> 3 <if test="flag != null and flag == "Y""><!--"字符转义--> 4 <if test="flag != null and flag == \"Y\""><!--字符转义,实测会报错-->
更深入一点,来看看OGNL语法到底是怎么解析的,导致出现了这个问题。
未完待续。。。