如何为具有多个不同参数系列的查询创建iBatis参数映射?

时间:2011-09-19 15:30:20

标签: java ibatis

我需要映射这种一般形式的sql语句:

SELECT ... 
FROM x, y, z
WHERE ( x.id = #x1# OR x.id = #x2# OR ... ) 
  AND ( y.id = #y1# OR y.id = #y2# OR ... )
  AND z.name = #name#;

所以我有两个参数列表和一个字符串。我想知道是否可以从iBatis dynamic SQL或其他东西做出某些事情。如果我可以构建自己的WHERE子句并且可能给它。因为不知何故我想使用iBatis将结果映射到Java对象......

你会怎么做?

3 个答案:

答案 0 :(得分:0)

您可以使用<iterate>标记迭代参数列表。我怀疑你有2个列表,一个包含参数名称,另一个包含参数值。是这样的吗?

如果是这样:要从中构建查询,您必须同时迭代这两个列表,这在iBatis中是不可能的。相反,您必须创建一个包含名称和值的类并传递它的列表。然后,您可以使用iBatis迭代该(单个)列表,并使用列表中的“当前”项访问名称和值。尝试使用这种方法,我过去成功使用过它。我一到家就试着为你找一些源代码。

编辑:好的,似乎你想要生成两个具有许多OR连接条件的块。在这种情况下,您可以依次使用2个<iterate>标记。您是否需要有关如何将多个参数传递到查询中的帮助?

答案 1 :(得分:0)

您的问题可能源于您在iBatis(或myBatis)配置文件中构建查询的方式。

为什么不使用一个or条件而不是一串in条件。

以下是一个例子:

SELECT ... 
FROM x, y, z
WHERE ( x.id in (#xstring# ) 
  AND ( y.id in (#ystring# )
  AND z.name = #name#;

答案 2 :(得分:0)

foreach元素(仅在ibatis3中可用 - mybatis)非常强大,允许您指定一个集合,声明可以在元素主体内使用的项目和索引变量。它还允许您指定开始和结束字符串,并添加一个分隔符以放置在迭代之间。该元素很聪明,因为它不会意外附加额外的分隔符。