您不能使用多個規則,但可以將一個規則嵌套在另一個規則中。這樣你就可以嵌套(n)個規則。所以你的查詢的嵌套片段只有在滿足所有規則時纔會運行(這是真的)。
因此,這是修復
<select id="getSth" resultClass="Object" parameterClass="Object">
SELECT * FROM TABLE
<isNotEmpty property="STARTDATE">
<isNotEmpty property="ENDDATE">
WHERE DATE_START >= #STARTDATE# AND DATE_END <= #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 >= #STARTDATE# AND DATE_END <= #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 >= #STARTDATE# AND DATE_END <= #ENDDATE#
<isNotEmpty>
<isNotEmpty>
</isNotNull>
</isNotNull>
</sql>
然後您的最終選擇標記將如下所示。
<select id="getSth" resultClass="Object" parameterClass="Object">
SELECT * FROM TABLE <include refid="getStartDateAndEndDateRuleFragment" />
</select>
這是confusing.In這樣別人合作開發你的團隊工作更清潔,更不能只是簡單的眼球,並計算出它在做什麼。
非常感謝你的建議。 – Raymond 2013-03-27 07:38:39