2015-02-06 100 views
0

我寫了下面的SQL Statment在iBatis的版本2:如何處理SQL Select語句(IBatis 2)中的Empty IN子句?

<select id="mySelect" resultClass="long" > 
    SELECT COUNT(*)   
    FROM myTable 
    WHERE myTable.columnA IN 
     <iterate property="myInClauseValues" open="(" close=")" conjunction=",">      
       #myInClauseValues[]#      
     </iterate>   
</select> 

這種說法能正常工作,如果myInClauseValues(這是一個長的ArrayList)包括至少一個值。但是,如果myInClauseValues是空的,我得到這樣的錯誤信息(使用Oracle數據庫I'm):

Check the statement (query failed). 
Cause: java.sql.SQLException: ORA-00936: Expression is missing 
+2

你不能有一個空的'in'。檢查你的數組的大小,不要把它添加它是空的 – 2015-02-06 06:33:02

+1

我同意@juergen d。檢查數組列表是否爲空,並且如果不是,則只執行查詢。由於無論如何查詢都會返回無結果的結果,因此最好不要一無所獲地返回數據庫。 如果出於某種瘋狂的原因不是一種選擇,那麼當數組列表爲空時,您可以嘗試在IN子句的括號之間獲得'null'。這樣查詢也只會返回零結果。 – Tarske 2015-02-06 06:35:06

回答

0

使用iBATIS dyanmic查詢是正確的做法?
例如:

<select id="mySelect" resultClass="long" > 
    SELECT COUNT(*)   
    FROM myTable 
    <where> 
    <isNotEmpty prepend="AND" property="myInClauseValues" > 
     myTable.columnA IN 
     <iterate property="myInClauseValues" open="(" close=")" conjunction=",">      
        #myInClauseValues[]#      
     </iterate>  
    </isNotEmpty> 
    </where>  
</select> 
+0

對不起,但你的解決方案不起作用!我在上面得到相同的錯誤信息:檢查語句(查詢失敗)。 原因:java.sql.SQLException:ORA-00936:缺少表達式 – MaikHansen 2015-02-06 06:51:36

+0

answer edited.Please更改isnotnull isnotempty。 – 2015-02-06 06:57:43

+0

對不起,但你的解決方案不再工作!我得到相同的錯誤信息! – MaikHansen 2015-02-06 07:00:32