如何在MyBatis foreach中迭代HashMap?

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)

其中的另一种方法是创建具有关键值字段类,创建对象的列表,然后通过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>
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)

  • **当心:自3.2.x版以来,这种方式被打破**: - 版本3.2.x直接支持地图[问题#709](https://code.google.com/p/mybatis/issues/detail ?id = 709)使用_ <foreach item ="value"index ="key"collection ="map"> _并且必须将其重写为此新表单 - 请参阅[问题#208](https://github.com/mybatis/mybatis-3/pull/208)或@foghost解决方案 (11认同)

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)