ibatis动态sql使用两个条件

时间:2012-07-25 15:06:30

标签: ibatis mybatis

我想使用动态sql语句,该语句仅在变量不为null且大于零时执行。像这样:

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

但没有预先加两个'AND'。

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

4 个答案:

答案 0 :(得分:6)

要解决这个问题,我几乎从不使用“prepend”功能,而是写一个像这样的SQL:

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

答案 1 :(得分: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)。

答案 2 :(得分:1)

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

来自文档:

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

答案 3 :(得分:0)

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

只需删除第一个前置项即可