2013-03-27 45 views
1

我是新來的iBatis。我想如果有可能將多個值傳遞給xml。將多個值傳遞給<isNotEmpty>屬性

例如,

<select id="getSth" resultClass="Object" parameterClass="Object"> 
    select * from table 
<isNotEmpty property="startDate, endDate" prepend="AND"> 
    date_start >= #startDate# AND date_end <= #endDate# 
</isNotEmpty> 
</select> 

是有可能這樣呢?如果沒有,任何方法?

在此先感謝。

回答

2

不,在屬性屬性中不能使用多個值。但是你可以使用嵌套標籤來實現這一點。 PS:你不能在查詢中使用小於'<',大於'>'的符號。分別使用&lt;&gt;

+0

非常感謝你的建議。 – Raymond 2013-03-27 07:38:39

0

您不能使用多個規則,但可以將一個規則嵌套在另一個規則中。這樣你就可以嵌套(n)個規則。所以你的查詢的嵌套片段只有在滿足所有規則時纔會運行(這是真的)。

因此,這是修復

<select id="getSth" resultClass="Object" parameterClass="Object"> 
SELECT * FROM TABLE 
<isNotEmpty property="STARTDATE"> 
    <isNotEmpty property="ENDDATE"> 
      WHERE DATE_START &gt;= #STARTDATE# AND DATE_END &lt;= #ENDDATE# 
    <isNotEmpty> 
<isNotEmpty> 
</select> 

您還可以檢查其他條件,如果你想,這樣你可以有混合的規則。

所以我可以在檢查isNotEmpty之前檢查我的STARTDATE,ENDDATE是否爲null isNotNull。通過這種方式,如果最終條件是錯誤的,IBATIS不會檢查其他條件。

<select id="getSth" resultClass="Object" parameterClass="Object"> 
SELECT * FROM TABLE 
<isNotNull property="STARTDATE"> 
    <isNotNull property="ENDDATE"> 
     <isNotEmpty property="STARTDATE"> 
      <isNotEmpty property="ENDDATE"> 
        WHERE DATE_START &gt;= #STARTDATE# AND DATE_END &lt;= #ENDDATE# 
      <isNotEmpty> 
     <isNotEmpty> 
    </isNotNull> 
</isNotNull> 
</select> 

有時你的條件片段可能變得如此之大,也許會讓人閱讀,理解和記錄混淆。您可能希望使用IBATIS sql標記將您的規則與主選擇語句分開。

<sql id="getStartDateAndEndDateRuleFragment"> 
<isNotNull property="STARTDATE"> 
    <isNotNull property="ENDDATE"> 
     <isNotEmpty property="STARTDATE"> 
      <isNotEmpty property="ENDDATE"> 
        WHERE DATE_START &gt;= #STARTDATE# AND DATE_END &lt;= #ENDDATE# 
      <isNotEmpty> 
     <isNotEmpty> 
    </isNotNull> 
</isNotNull> 
</sql> 

然後您的最終選擇標記將如下所示。

<select id="getSth" resultClass="Object" parameterClass="Object"> 
SELECT * FROM TABLE <include refid="getStartDateAndEndDateRuleFragment" /> 
</select> 

這是confusing.In這樣別人合作開發你的團隊工作更清潔,更不能只是簡單的眼球,並計算出它在做什麼。

1
<select id="getSth" resultClass="Object" parameterClass="Object"> 
select * from table 
<isNotEmpty property="startDate" > 
    <isNotEmpty property="endDate" > 
     where date_start &gt;= #startDate# AND date_end &lt;= #endDate# 
    </isNotEmpty> 
    <isNotEmpty property="endDate" > 
     where date_start &gt;= #startDate# AND date_end &lt;= #endDate# 
    </isNotEmpty> 
</isNotEmpty>