gpt4 book ai didi

foreach - 在 MyBatis 3 中为 HashMap 参数嵌套 foreach

转载 作者:行者123 更新时间:2023-12-04 20:15:57 26 4
gpt4 key购买 nike

我正在尝试使用 MyBatis 3.0.6 找出以下问题的解决方案:

我需要基于一系列参数构建一个动态选择语句,其中一个类型是 HashMap<String, List<String>> .挑战在于弄清楚如何让 MyBatis 迭代外部 foreach 循环中的所有键,以及迭代内部循环中值列表的元素。

为了说明,假设我的哈希映射参数名为 过滤器 包含每个国家/地区(国家/地区代码作为键)的州(州代码列表,每个列表都是值),如下所示:

'US' -> {'CO','NY','MI','AZ'};
'CA' -> {'ON','BC','QC'}

我需要我的动态 SQL 看起来像这样(以非常简化的形式):
SELECT *
FROM Table1
WHERE ... some static criteria goes here...
AND RowId IN (SELECT RowId FROM Table2 WHERE Country = 'US' AND State IN ('CO','NY','MI','AZ')
AND RowId IN (SELECT RowId FROM Table2 WHERE Country = 'CA' AND State IN ('ON','BC,'QC')

我想我的映射器 XML 应该是这样的:
<select id="getData" resultType="QueryResult">
SELECT *
FROM Table1
WHERE ... some static criteria goes here...
<if test="filter != null">
<foreach item="country" index="i" collection="filter" separator="AND">
RowId IN (SELECT RowId
FROM Table2
WHERE Country = #{country} AND State IN
<foreach item="state" index="j" collection="country.states" separator="," open="(" close=")">
#{state}
</foreach>
</foreach>
</if>
</select>

所以问题是,获得 的正确语法是什么?国家/地区在嵌套的 foreach 循环中迭代?

更新

经过一些修补后,我无法让 MyBatis 很好地使用基于 HashMap 的方法,所以我最终添加了一个新类,将多个值映射到它们的父值,然后将此类对象的列表传递给 MyBatis。使用上面的国家/地区示例,该类如下所示:
public class Filter {
private String country;
private ArrayList<String> states;

// ... public get accessors here ...
}

DAO方法:
public void QueryResult[] getResults( @Param("criteria") List<Filter> criteria) ...

和 MyBatis 映射:
<select id="getData" resultType="QueryResult">
SELECT *
FROM Table1
WHERE ... some static criteria goes here...
<if test="criteria!= null">
<foreach item="filter" index="i" collection="criteria" separator="AND" open="AND">
RowId IN (SELECT RowId
FROM Table2
WHERE Country = #{filter.country} AND State IN
<foreach item="state" index="j" collection="filter.states" separator="," open="(" close=")">
#{state}
</foreach>
</foreach>
</if>
</select>

奇迹般有效。

最佳答案

实际上,您可以使用国家/地区值在过滤器映射中查找它并使其像最初拥有的那样工作。在第二个循环中,您的集合将被定义为 filter.get(country)这应该很好。这当然是考虑到我正确解释了您的问题。

关于foreach - 在 MyBatis 3 中为 HashMap 参数嵌套 foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358167/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com