Cas*_*uck 5 foreach hashmap mybatis
我试图找出使用MyBatis 3.0.6解决以下问题的方法:
我需要根据一系列参数构建动态select语句,其中一个参数类型HashMap<String, List<String>>.挑战在于弄清楚如何使MyBatis迭代外部foreach循环中的所有键,以及迭代内部循环中值列表的元素.
为了说明,假设我的名为filter的哈希映射参数包含每个国家的状态(状态代码列表,每个列表是值)(国家代码作为键),如下所示:
'US' -> {'CO','NY','MI','AZ'};
'CA' -> {'ON','BC','QC'}
Run Code Online (Sandbox Code Playgroud)
我需要我的动态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')
Run Code Online (Sandbox Code Playgroud)
我想我的mapper 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>
Run Code Online (Sandbox Code Playgroud)
所以问题是,使用country.states在嵌套的foreach循环中迭代的正确语法是什么?
UPDATE
经过一些修补后,我无法让MyBatis与基于HashMap的方法很好地配合,所以我最终添加了一个新的类,它将多个值映射到它们的父值,然后将这些对象的列表传递给MyBatis.使用上面的国家/州示例,该类看起来像这样:
public class Filter {
private String country;
private ArrayList<String> states;
// ... public get accessors here ...
}
Run Code Online (Sandbox Code Playgroud)
DAO方法:
public void QueryResult[] getResults( @Param("criteria") List<Filter> criteria) ...
Run Code Online (Sandbox Code Playgroud)
和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>
Run Code Online (Sandbox Code Playgroud)
奇迹般有效.
小智 3
实际上,您可以使用国家/地区值在过滤器地图中查找它并使其像最初一样工作。在第二个循环中,您的集合将被定义为filter.get(country),这应该很好。当然,考虑到我正确解释了你的问题。
| 归档时间: |
|
| 查看次数: |
12018 次 |
| 最近记录: |