2013-08-22 103 views
8

我正试图产生一个如下mybatis中的SQL。如何通过MyBatis foreach中的HashMap进行迭代?

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

而我的输入参数类型是HashMap。现在如何从mapper xml文件生成SQL。下面的代码会抛出异常,并将映射评估为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> 

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

但是,有没有办法让我的mapper工作的第一种方法?除了将查询更改为union之外

回答

13

此解决方案自3.2版起无法使用 - 详见Issue #208

最后我已经为HashMap的

的解决方案,我应该以使其可重复的

<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使用entrySet()注释

因此映射器接口如下所示。

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

**请注意:由于版本3.2.x中这种方式被打破**: - 版本3.2.x中有一个直接支持使用_ _ [map#] [问题#709](https://code.google.com/p/mybatis/issues/detail?id=709)并且必须将其重写为这种新形式 - 请参见[问题#208](https://github.com/mybatis/mybatis-3/pull/208)或@foghost解决方案 –

+0

请指出 –

+0

@MichalBernhard请问您可以发布你自己的答案?这将有助于更多的游客。 –

1

在第一个示例中,mybatis正在使用键“map”在parameterMap中查找条目。我怀疑你实际上是在迭代parameterMap的关键集合。如果你使用键“map”在参数图中嵌套地图,它应该可以工作。

在第二个示例中,您应该能够传递提供getKey和getValue的HashMap.entrySet()。

11

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

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

此功能仅适用于版本3.2.x(请参阅[问题#709](https://code.google.com/p/mybatis/issues/detail?id=709) –