事出有因
今天遇到一个mybatis语法的bug,在此记录一下。
业务是前台有一个跟进状态的筛选按钮,与前台约定的参数是Integer类型的0-4, 标志不同的状态,根据不同的参数做不同的过滤。mybatis的语法如下。
<if test="query.followStatus != null and query.followStatus != ''">
<choose>
<!--未跟进-->
<when test="query.followStatus == 0">
AND scfu.id IS NULL
</when>
<!--未选择意向-->
<when test="query.followStatus == 4">
AND scfu.intention IS NULL AND scfu.id IS NOT NULL
</when>
<!--1,2,3的情况-->
<otherwise>
AND scfu.intention = #{query.followStatus}
</otherwise>
</choose>
</if>
今天客户反馈了一个bug,该筛选项在前台选中未跟进时,会出现筛选项无效的情况。也就是第一行 if test
都没有进去,因为进去了的话,最起码什么都不符合的情况都会进入 otherwise
,所以定位到问题出现在外层 if
。通过搜索发现有人遇到过相似的问题。
解决方案
MyBatis参数为Integer型并赋值为0时判断失误的问题解决
根据这位博主介绍,mybatis的test语法,在类型为Integer
时,如果值为0
, 会被识别为 ''
(空), 导致第一个if的后一部分 query.followStatus != ''
不符合。最终没有进入 if
的逻辑。解决方法上面的博主已经给出了,我再此贴一下
- 通过or进行二次判断
<if test="status !=null and (status!='' or status == 0)">
业务逻辑
</if>
- 对Integer类型去除 != '' 的判断
后记
另一个常出现的问题,test语法中,布尔值比较需要用 bool == true
的语法判断,说明:bool(一个布尔值变量)