tofacebook.com -专业IT技术社区(指牛堂) mybatis:java.util.ArrayList and java.lang.String - 指牛堂-专业IT技术平台
251°

mybatis:java.util.ArrayList and java.lang.String

今天武汉会议团队在代码走查时发现了一个mybatis作为dao层查询中存在参数使用前校验不全的问题修改后却触发了另外一个错误,情况如下。 走查时代码如下(existIds传入的一个集合,只判断了未定义的情况,在集合有定义但长度为0时会报错):

SELECT
<include refid="Base_Column_List"/>
FROM SYS_BIZAPP
WHERE 1=1
<if test="existIds!=null">
      AND ID NOT IN (
       <foreach collection="existIds" item="item" index="index" separator=",">
             #{item,jdbcType=VARCHAR}
       </foreach>
      )
</if>

经过提示开发修改提交,我们再次检查修改情况时发现代码如下。

SELECT
<include refid="Base_Column_List"/>
FROM SYS_BIZAPP
WHERE 1=1
<if test="existIds!=null and existIds!='' ">
      AND ID NOT IN (
       <foreach collection="existIds" item="item" index="index" separator=",">
             #{item,jdbcType=VARCHAR}
       </foreach>
      )
</if>

该查询语句在执行过程中会发生

java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.String 的情况。

因为错误的使用空字符串的判断方式来判断集合是否为空。需要将判断方式改为size>0即可。最终修改代码如下:

SELECT
<include refid="Base_Column_List"/>
FROM SYS_BIZAPP
WHERE 1=1
<if test="existIds!=null and existIds.size>0 ">
      AND ID NOT IN (
       <foreach collection="existIds" item="item" index="index" separator=",">
             #{item,jdbcType=VARCHAR}
       </foreach>
      )
</if>

已有 0 条评论

    我有话说: