java.lang.IllegalArgumentException: invalid comparison: 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>

你可能感兴趣的:(mybatis使用)