哈喽,大家好呀,好久不见!今天是一篇浅记。MyBatis的条件判断中,使用单引号或双引号来判定字符串类型数值的坑…
一、单引号与双引号的区别
在MyBatis的条件判断中,使用单引号或双引号来括起字符串值都是可以的。但是在比较字符串类型的数字时,它们会产生不同的效果。
- 单引号:使用单引号括起字符串值,比较的是字符的字典顺序,而不是数值的大小。
- 双引号:使用双引号括起字符串值,会将字符串尝试转换为数值类型进行比较。
这就引发了一个问题:字符串类型数值形式数据如何处理判定呢?单引号就一定不能用吗?
让我们以一个字段 bpmStatus的条件判断为例,它存储了流程状态的值,以字符串类型的数字表示。需要根据不同的状态值生成不同的 SQL 条件。
<if test="dto.bpmStatus != null and dto.bpmStatus != ''">
<choose>
<when test="dto.bpmStatus == '3'">
AND (a.bpm_status = '4' OR a.bpm_status = '5')
</when>
<when test="dto.bpmStatus == '1'">
AND a.bpm_status = '2'
</when>
<when test="dto.bpmStatus == '2'">
AND a.bpm_status = '3'
</when>
</choose>
</if>
乍一看,可能认为这样的写法 “没有问题”,好像觉得 “使用了单引号括起数值字符,它们就是字符串了” 。但是你运行代码后,你会发现条件判断并没有生效,SQL 条件没有被正确拼接!
楼主甚至还傻傻的检查了一下参数定义,主打就是一个纯情:怀疑过代码都没有怀疑过自己…
没毛病,问题的根源确实在于字符串类型的数字不能这么处理。
二、解决方案
为了解决这个问题,我们有两种方案:
方案一:转换数字类型
为了确保条件判断的准确性,建议在比较字符串类型的数字时使用双引号括起字符串值。这样会将字符串尝试转换为数值类型进行比较,得到正确的结果。
<if test="dto.bpmStatus != null and dto.bpmStatus != ''">
<choose>
<when test='dto.bpmStatus == "3"'>
AND (a.bpm_status = '4' OR a.bpm_status = '5')
</when>
<when test='dto.bpmStatus == "1"'>
AND a.bpm_status = '2'
</when>
<when test='dto.bpmStatus == "2"'>
AND a.bpm_status = '3'
</when>
</choose>
</if>
方案二:转换字符串类型
如果你希望继续使用单引号括起字符串值,但又需要进行数值比较,可以考虑进行数据类型转换为字符串,也可以实现。
<if test="dto.bpmStatus != null and dto.bpmStatus != ''">
<choose>
<when test="dto.bpmStatus == '3'.toString()">
AND (a.bpm_status = '4' OR a.bpm_status = '5')
</when>
<when test="dto.bpmStatus == '1'.toString()">
AND a.bpm_status = '2'
</when>
<when test="dto.bpmStatus == '2'.toString()">
AND a.bpm_status = '3'
</when>
</choose>
</if>