使用foreach动态生成sql的问题

2016-09-01  本文已影响0人  48892085f47c

使用mybatis可以动态生成sql,当使用foreach动态生成sql尝尝会遇到如下问题:
先贴代码;

// dao层java代码
List<Post> selectPostIn(List<Long> ids);

// xml配置文件代码
<select id="selectPostIn" resultType="Post" parameterType="list">
            SELECT * FROM POST P WHERE ID in 
<foreach item="item" index="index" 
             collection="list" open="(" separator="," close=")"> 
           #{item} 
</foreach>
</select>

当list为空时,生成的sql如下:

SELECT * FROM POST P WHERE ID in;

执行后报错,原因是in后面没有id的数组;

解决方案1:

针对输入的list做非空判断,只有list!=null && list.size()>0 才执行daoList<Post> selectPostIn(List<Long> ids);,避免sql报错;

解决方案2:

讲xml文件中的parameterType更改为map,即parameterType="map",dao层参数也改为map,具体代码如下:

param.put("ids",List<Long> ids);
// dao层java代码
List<Post> selectPostIn(Map<String, Object> param);

// xml配置文件代码
<select id="selectPostIn" resultType="Post" parameterType="map">
            SELECT * FROM POST P WHERE  1=1
<if test="ids != null">
        and ID in 
        <foreach item="item" index="index" 
        collection="ids" open="(" separator="," close=")"> 
        #{item} 
</foreach>
</if>
</select>

xml文件取出param参数key=ids的值,xml对ids的值做非null判断,当ids存在是sql语句为SELECT * FROM POST P WHERE 1=1 and ID in (1,2,3);当ids为null时,sql语句为```
SELECT * FROM POST P WHERE 1=1;


END;
本文为作者原创,如需转载请注明地址[使用foreach动态生成sql的问题](http://www.jianshu.com/p/5f27f0991e90);
如果本文对你有所帮忙,请点个赞,您的支持是我写作的最大动力;
上一篇下一篇

猜你喜欢

热点阅读