複数のルールを使用することはできませんが、1つのルールを別のルールにネストすることはできます。このようにして、(n)個のルールをネストできます。したがって、クエリのネストされたフラグメントは、すべてのルールが満たされた場合にのみ実行されます(これはtrueです)。
これが修正です
<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ではないことを確認できます。このようにして、最も外側の条件がfalseの場合、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タグを使用して、ルールをメインのselectステートメントから分離することをお勧めします。
<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>
これはよりクリーンで混乱が少なくなります。このようにして、チームで作業している他の共同開発者は、それを簡単に目で見て、それが何をしているのかを理解することができます。