将多个值传递给<isnotempty> property </isnotempty>

时间:2013-03-27 06:52:56

标签: java sql ibatis

我是iBatis的新手。我想如果可以将多个值传递给xml。

例如,

    <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>
是不是可能?如果没有,任何方法?

提前致谢。

3 个答案:

答案 0 :(得分:2)

不,不可能在属性属性中使用多个值。但您可以使用嵌套标记来实现此目的。

<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>

PS:你不能使用少于'&lt;' ,大于'&gt;'查询中的符号。而是分别使用&lt;&gt;

答案 1 :(得分: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>

答案 2 :(得分: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标记将规则与主select语句分开。

<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>

这更干净,更少混乱。这样,在你的团队中工作的其他合作开发人员可以简单地将其视线并弄清楚它在做什么。