12

我正在尝试在 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>

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

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

4

4 回答 4

16

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

<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>
于 2014-05-08T07:04:49.123 回答
15

此解决方案从 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>

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

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

List<TblData> selectCOLC(@Param("entries")
            HashMap<String, String> entries)
于 2014-02-13T14:57:09.843 回答
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()",成功了!

此外,不需要关于parameterType的规范。

于 2019-07-30T06:56:53.297 回答
1

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

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

于 2013-09-17T15:24:42.407 回答