问题描述:
最近工作中有个修改任务,代码中使用了Mybatis条件表达式比较字符串。
参数:
@Data
public class QueryParam
{
private String itemid;
private String itemOption;
...
}
mybatis xml:
<select id = "sample1">
select ...
...
<when test="itemOption == 'A'">
order by a.itemid
<when>
...
</select>
测试的时候,给itemOption传了个参数"A"。
{...,"itemOption":"A"}
程序运行的时候报错:java.lang.NumberFormatException : For input string: "A"
问题解析:
一开始我百思不得其解,定义的参数类型是字符串,平时比较字符串就是这样写的,怎么会出错呢。后来同事提醒Mybatis是不是把'A'当成字符了,字符比较的时候会转成ASCII码比较。
我做了下试验:
把条件表达式改成
<when test="itemOption == 'Aa'">
然后参数值改成 Aa发送过去,正常了。由此可以看到,当被比较的常量单引号内只有一个字符时,Mybatis会把它当成字符型Character。两个以上的字符才会把它当成字符串。在‘Aa’后面引用一个不存在的方法(toStr),系统给出的提示也表明Mybatis把单个字符当Character了。
但是我就是要用单个的字符比较怎么办呢?经过查找和试验找到了两种方式:
①用Character的toString方法括号写不写都行
<when test="itemOption == 'A'.toString">
②再加一个空串
<when test="itemOption == 'A'+''">
这两种方法我试了都可以的,当然可能还有别的方法。
总结:
1,Mybatis条件表达式比较字符串时,单个字符常量会被当成Character对象,和传过来的值比较时会报错。
2,可以在常量后面加toString方法或者加空串来应对这种情况。