2011-09-19 62 views
0

我需要映射的一般形式SQL语句:如何为包含多个参数系列的查询制作iBatis参数映射?

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#; 

所以,我有参数的两个列表和1串。我想知道是否可以从iBatis dynamic SQL什么东西。如果我只是可以建立我自己的WHERE条款并给予它。因为不知何故,我想用iBatis将结果映射到Java对象...

你会怎么做?

回答

0

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

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

编辑:好吧,它似乎你想要生成两个块有很多或加入条件。在这种情况下,您可以依次使用2个<iterate>标签。如何将多个参数传递到查询中需要帮助吗?

+0

是啊,想了一会儿,我想我能够摆脱一个列表。尽管如此,仍然有一个参数。似乎列表实际上放在一个地图,但我可以通过一个列表和一个字符串的地图。我不完全知道如何做现在的迭代的东西,但是似乎应该有可能做到至少,这很好:) – jonalv

+0

不,我错了。我真的需要两个名单。我可以先重复一遍,然后再遍历另一遍。我希望... :) – jonalv

0

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

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

下面是一个例子:

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

在foreach元素(仅适用于ibatis3 - MyBatis的)是非常强大的,并允许你指定一个集合,声明可以在里面的使用项目和指标变量元素的身体。它还允许您指定打开和关闭字符串,并添加一个分隔符以放置在迭代之间。元素非常聪明,它不会无意中附加额外的分隔符。