Mybatis动态SQL的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候),可以将List、Set、数组等类型的数据作为参数。但是当List作为参数时,判断空需要特别注意。
例如:
<if test="struIds != null and struIds !='' ">
AND RELATION_ID IN
<foreach collection="struIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
上面的mapper将会报错,信息如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.String
### Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.ArrayList and java.lang.String
解决办法是:应该将判断集合是否为空的代码尽量放在程序里,如果非要让Mybatis来处理的话,可以参考下面的方式:
<if test="struIds != null and struIds.size() > 0">
OR RELATION_ID IN
<foreach collection="struIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
或
<if test="struIds != null and struIds.size > 0">
OR RELATION_ID IN
<foreach collection="struIds" index="index" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
References:
1.How can I skip query if where_in clause is empty in MyBatis 3?
2.mybatis 3 foreach
最新评论
我的是ipv4网络,如何使用直播源啊!
我今天试了,不想啊,我的是新疆昌吉移动的网络。
收不到验证码电报
现在充值29起了