【问题标题】:How can I make an iBatis parameter mapping for a query with multiple series of various paramaters?如何为具有多个系列的各种参数的查询制作 iBatis 参数映射?
【发布时间】:2011-09-19 15:30:19
【问题描述】:

我需要映射这个一般形式的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 dynamic SQL 或其他东西制作东西。如果我可以建立自己的WHERE 子句并提供它。因为不知何故我想使用 iBatis 将结果映射到 Java 对象中......

你会怎么做?

【问题讨论】:

    标签: java ibatis


    【解决方案1】:

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

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

    这是一个例子:

    选择 ... 从 x、y、z WHERE ( x.id in (#xstring# ) AND ( y.id in (#ystring# ) 和 z.name = #name#;

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 是的,在考虑了一段时间之后,我认为我能够摆脱一份清单。不过还有一个参数。似乎列表实际上放在了一个地图中,所以我可能可以传递一个带有列表和字符串的地图。我现在还不完全确定如何做那个迭代的事情,但是是的,似乎至少应该可以做到,这很好:)
      • 不,我错了。我真的需要两个清单。我可以先迭代一个然后再迭代另一个。我希望... :)
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 2011-12-08
        • 2020-02-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多