Kar*_*sad 9 java sql foreach mybatis
我正在尝试在mybatis中生成如下所示的sql.
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in ( ('kp','kar'),('srt','sach'));
Run Code Online (Sandbox Code Playgroud)
我的输入参数类型是HashMap.现在如何从mapper xml文件生成SQL.下面的代码抛出异常,说map被评估为null.
<select id="selectCOLC" parameterType="java.util.HashMap" resultType="String">
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in
<foreach item="item" collection="#{map.keySet()}" open="((" separator="),(" close="))">
#{item},#{item.get(item)}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)
其中的另一种方法是创建具有关键值字段类,创建对象的列表,然后通过parameterType为list它看起来像下面.
<select id="selectCOLC" parameterType="list" resultType="String">
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in
<foreach item="item" collection="list" open="((" separator="),(" close="))">
#{item.getKey()},#{item.getVal()}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)
但有没有办法让我的mapper工作第一种方法?除了将查询更改为union之外
Kar*_*sad 14
从版本3.2开始,此解决方案无效 - 请参阅问题#208中的更多信息!
最后,我得到了HashMap的解决方案
我应该使用entrySet()它以使其可迭代
<select id="selectCOLC" parameterType="map" resultType="kpMap">
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in
<foreach item="item" collection="entries.entrySet()" open="((" separator="),(" close="))">
#{item.key},#{item.value}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)
还有一个Isue我面临的参数名称没有被注入,因此添加了@Param注释
因此映射器界面如下所示.
List<TblData> selectCOLC(@Param("entries")
HashMap<String, String> entries)
Run Code Online (Sandbox Code Playgroud)
fog*_*ost 14
这是我的项目中的一个例子,它工作正常
<select id="getObject" parameterType="Map" resultType="hashmap">
select * from TABL where
<foreach collection="dataMap" index="key" item="value" open="" separator=" and " close="">
#{key}=#{value}
</foreach>
</select>
Run Code Online (Sandbox Code Playgroud)