我想使用动态sql语句,该语句仅在变量不为null且大于零时执行。像这样:
<isNotNull prepend="AND" property="ProprietaryId">
<isGreaterThan prepend="AND" property="ProprietaryId" compareValue="0">
G.PROPRIETARY_ID = #ProprietaryId#
</isGreaterThan>
</isNotNull>
但没有预先加两个'AND'。
我已经阅读了文档,但没有找到好的例子。
答案 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>
只需删除第一个前置项即可