0

我想使用仅当变量不为空且大于零时才执行的动态 sql 语句。像这样:

<isNotNull prepend="AND" property="ProprietaryId">
    <isGreaterThan prepend="AND" property="ProprietaryId" compareValue="0">
        G.PROPRIETARY_ID = #ProprietaryId#
    </isGreaterThan>
</isNotNull>

但没有前置两个'AND'。

我已阅读文档,但没有找到好的示例。

4

4 回答 4

6

为了解决这个问题,我几乎从不使用“前置”功能,而是编写这样的 sql:

WHERE 1=1
<isNotNull property="ProprietaryId">
    <isGreaterThan property="ProprietaryId" compareValue="0">
    AND G.PROPRIETARY_ID = #ProprietaryId#
    </isGreaterThan>
</isNotNull>
于 2012-07-26T14:18:15.673 回答
3

我只是在寻找相同的答案时遇到了这个问题。虽然有效,但这种解决方案让我有些烦恼,所以我更多地研究了 iBATIS 文档并注意到了这个例子:

  <dynamic prepend="where">
    <isGreaterThan prepend="and" property="id" compareValue="0">
      ACC_ID = #id#
    </isGreaterThan>
    <isNotNull prepend="and" property="lastName">
      ACC_LAST_NAME = #lastName#
    </isNotNull>
  </dynamic>

如果只有一个条件为真,您可能会认为这可能会导致在 WHERE 子句中包含多余的“和”,但显然 iBATIS 足够聪明,可以在使用动态标签时防止这种情况发生。它对我有用(在这种情况下使用 iBATIS 2.3.0)。

于 2013-07-02T17:16:37.540 回答
1

是来自未来的我。父元素覆盖其第一个子元素的前置,因此您的代码将正常工作,因为isGreaterThan前置将被父isNotNull前置覆盖。

从文档:

prepend 属性是代码的一部分,如果需要,它可以被父元素的 prepend 覆盖。在上面的示例中,“where”前置将覆盖第一个真正的条件前置。这是确保正确构建 SQL 语句所必需的。例如,在第一个为真条件的情况下,不需要 AND,实际上它会破坏语句。

于 2015-02-13T15:50:36.907 回答
0
<isNotNull property="ProprietaryId">
    <isGreaterThan prepend="AND" property="ProprietaryId" compareValue="0">
        G.PROPRIETARY_ID = #ProprietaryId#
    </isGreaterThan>
</isNotNull>

只需删除第一个前置即可

于 2019-07-25T09:44:31.800 回答