如何为具有多个系列的各种参数的查询进行 iBatis 参数映射?

发布于 2024-12-05 11:40:33 字数 432 浏览 2 评论 0原文

我需要映射这种通用形式的 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#;

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

你会怎么做?

I need to map a sql statement of this general form:

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

So I have two lists of parameters and 1 string. I am wondering if something can be made from perhaps iBatis dynamic SQL or something. If I just could build my own WHERE clause and give it perhaps. Because somehow I want to use iBatis for mapping the result into Java objects...

How would you do?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

许仙没带伞 2024-12-12 11:40:33

您的问题似乎是您在 iBatis (或 myBatis)配置文件中构建查询的方式造成的。

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

这是一个例子:

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

Your problem seens to be a result of the way in which you framed the query in your iBatis (or myBatis) configuration file.

Instead of a string of or conditions why not use one in condition.

Here is an example:

SELECT ... 
FROM x, y, z
WHERE ( x.id in (#xstring# ) 
  AND ( y.id in (#ystring# )
  AND z.name = #name#;
冰火雁神 2024-12-12 11:40:33

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

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

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

You can use the <iterate> tag to iterate over your parameter list. I suspect that you have 2 lists, one containing the parameter names, the other containing the parameter value. Is that the case?

If so: To build a query from that, you would have to iterate both lists simultaneously, which is not possible in iBatis. Instead, you will have to create a class containing both name and value and pass the list of it. Then you can use iBatis to iterate over that (single) list and access name and value using the "current" item from the list. Try to use this approach, I've used it successfully in the past. I'll try to find some source code for you as soon as I'm home.

EDIT: Ok, it seems you want to generate two blocks that have many OR-joined conditions. In that case you can use 2 <iterate> tags one after the other. Do you need help on how to pass multiple parameters into the query?

请止步禁区 2024-12-12 11:40:33

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

The foreach element (available only in ibatis3 - mybatis) is very powerful, and allows you to specify a collection, declare item and index variables that can be used inside the body of the element. It also allows you to specify opening and closing strings, and add a separator to place in between iterations. The element is smart in that it won’t accidentally append extra separators.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文