如何在MyBatis foreach中迭代HashMap?

2022-09-05 00:36:09

我正在尝试生成一个sql,如下所示。

SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in ( ('kp','kar'),('srt','sach'));

我的输入参数类型是HashMap。现在如何从映射器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>

另一种方法是创建一个具有键值字段的类,创建一个对象列表,然后传递如下所示的 as。parameterTypelist

<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>

但是,有没有办法让我的映射器为第一种方法工作?除了将查询更改为联合


答案 1

这是我项目中的一个例子,它工作正常

<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>

答案 2

此解决方案自版本 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>

我面临的另一个Isue参数名称没有被注入,因此添加了注释@Param

因此,映射器界面如下所示。

List<TblData> selectCOLC(@Param("entries")
            HashMap<String, String> entries)