您不能使用多条规则,但可以将一条规则嵌套在另一条规则中。通过这种方式,您可以嵌套 (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 是否为空 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>
这更清晰,更不容易混淆。这样,在您的团队中工作的其他共同开发人员只需简单地注视它并弄清楚它在做什么。