事出有因

今天遇到一个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 的逻辑。解决方法上面的博主已经给出了,我再此贴一下

  1. 通过or进行二次判断
<if test="status !=null and (status!='' or status == 0)">
    业务逻辑
</if>
  1. 对Integer类型去除 != '' 的判断

后记

另一个常出现的问题,test语法中,布尔值比较需要用 bool == true 的语法判断,说明:bool(一个布尔值变量)