如何在MyBatis的foreach中通过HashMap迭代? [英] How to Iterate through HashMap in MyBatis foreach?

查看:1615
本文介绍了如何在MyBatis的foreach中通过HashMap迭代?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  SELECT COL_C 
FROM TBLE_1

我试图在mybatis中生成一个sql。 (('kp','kar'),('srt','sach'))中的
WHERE(COL_A,COL_B)

而我的输入参数类型是HashMap。现在如何从mapper xml文件生成SQL。

 < select id =selectCOLCparameterType =java.util。 HashMapresultType =String> 
SELECT COL_C
FROM TBLE_1
WHERE(COL_A,COL_B)in
< foreach item =itemcollection =#{map.keySet()}open = ((separator =),(close =))>
#{item},#{item.get(item)}
< / foreach>
< / select>

另一种方法是创建一个包含键值字段的类,创建一个对象列表然后将 parameterType 作为 list 传递,看起来像下面这样。

 < select id =selectCOLCparameterType =listresultType =String> 
SELECT COL_C
FROM TBLE_1
WHERE(COL_A,COL_B)in
< foreach item =itemcollection =listopen =((separator =) ,(close =))>
#{item.getKey()},#{item.getVal()}
< / foreach>
< / select>

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

解决方案

从3.2版本开始,此解决方案不起作用 - href =https://github.com/mybatis/mybatis-3/pull/208 =noreferrer> Issue#208 !



最后,我已经为HashMap解决方案

我应该使用 entrySet()它可迭代


 < select id =selectCOLCparameterType =mapresultType =kpMap> 
SELECT COL_C
FROM TBLE_1
WHERE(COL_A,COL_B)in
< foreach item =itemcollection =entries.entrySet()open =(( separator =),(close =))>>
#{item.key},#{item.value}
< / foreach>
< / select>

另外一个Isue我正在面对的参数名称没有被注入,因此添加了 @Param 注解



因此,mapper接口如下所示:

 列表与LT; TblData> selectCOLC(@Param(entries)
HashMap< String,String>条目)


I'm trying to produce a sql which is as below in mybatis.

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

And my input parameter type is HashMap. Now How do I generate SQL from mapper xml file. The below code throws exception saying map evaluated to 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>

One of the other approach is to create a class with key value fields, create a list of object and then pass the parameterType as list which would look like following.

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

But is there any way to my mapper work for the first approach? other than changing the query to union

解决方案

This solution doesn't work since version 3.2 - see more in Issue #208 !

Finally I've the solution for HashMap

I Should use entrySet() in order to make it iteratable

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

One more Isue I was facing parameter name was not getting injected, Hence added @Param annotation

Hence mapper interface looks like below.

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

这篇关于如何在MyBatis的foreach中通过HashMap迭代?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆