2012-07-25 49 views
0

我想使用一個動態的sql語句,只在變量不爲空且大於零時才執行。像這樣:ibatis動態sql使用兩個條件

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

但沒有預先計劃兩個A​​ND。

我已閱讀文檔,但沒有找到好的例子。

回答

6

要解決這個問題,我幾乎從來不使用「前置」的功能,而是寫一個像這樣的SQL:

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

謝謝!我認爲前置是必需的.. – anthonybell 2012-07-26 20:27:34

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)。

1

它來自未來。父元素會覆蓋第一個子元素的前置,所以您的代碼將會正常工作,因爲isGreaterThan前置將被前置父isNotNull覆蓋。

從文檔:

的前置屬性是是免費的,如果必要的由一個父元素的前置覆蓋的代碼的一部分。在上面的例子中,「where」前置將覆蓋第一個真正的條件前置。這是確保SQL語句正確構建所必需的。例如,對於第一個真實情況,不需要AND,事實上它會打破陳述。