我正在尝试在mybatis中生成如下sql。
SELECT COL_C
FROM TBLE_1
WHERE (COL_A, COL_B) in ( ('kp','kar'),('srt','sach'));
而我的输入参数类型是HashMap。现在如何从映射器 xml 文件生成 SQL。下面的代码抛出异常,说映射评估为空。
<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>
但是我的映射器有什么方法可以用于第一种方法吗?除了将查询更改为 union 之外
这是我项目中的一个示例,效果很好
<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>
此解决方案自版本 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)
作为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 的 none 规范。
在第一个示例中,mybatis 正在使用键“map”在parameterMap 中查找条目。我怀疑您实际上是在尝试迭代parameterMap 的键集。如果您使用“map”键将映射嵌套在参数映射中,它应该可以工作。
在第二个示例中,您应该能够传递提供 getKey 和 getValue 的 HashMap.entrySet()。
这是一个简单的例子。
<foreach index="key" item="value" collection="your_map_collection">
#{key} = #{value}
</foreach>
当使用Map(或Map.Entry对象的集合)时,index将是键对象,item将是值对象。 https://mybatis.org/mybatis-3/dynamic-sql.html#foreach