【问题标题】:How to Iterate through HashMap in MyBatis foreach?如何在 MyBatis foreach 中迭代 HashMap?
【发布时间】:2013-08-22 19:09:35
【问题描述】:

我正在尝试在mybatis中生成如下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>

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

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

【问题讨论】:

    标签: java sql foreach mybatis


    【解决方案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 版起不再有效 - 请参阅 Issue #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>
    

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

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

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

    【讨论】:

    • 注意:自 3.2.x 版以来,这种方式已被破坏:- 3.2.x 版直接支持带有 Issue #709 value" index="key" collection="map"> 并且必须重写为这种新形式 - 请参阅 Issue #208 或 @foghost 解决方案
    • @MichalBernhard 你能发表你自己的答案吗?这将对更多的访问者有很大帮助。
    • 我发布了一个对我的 batis 3.5 有效
    • @MichalBernhard 我使用的是 3.2.x,所以我应该如何使用地图值。从第 208 期问题中仍然不清楚。我应该写 #{value()}
    • 下面用户“Arcones”的@RujutaS 解决方案不起作用? Arcones 回答链接:stackoverflow.com/a/57265950/70786
    【解决方案3】:

    作为一个mybatis 3.5的用户,我是熬过来的。

    不幸的是,此处发布的解决方案均不适合我,但确实如此:

    <foreach collection="_parameter.entrySet()" index="key" item="element" separator=",">
        MY_COLUMN = #{key} AND MY_OTHER_COLUMN = #{element}
    </foreach>
    

    所以,就我而言,collection="_parameter.entrySet()" 成功了!

    此外,还需要关于 parameterTypenone 规范。

    【讨论】:

    • 它也对我有用。我正在使用带有 mybatis 的 spring-boot。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2016-03-09
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多