日期:2014-05-16  浏览次数:20474 次

ibatis and 未被拼接上的问题

?

ibatis中,

<dynamic prepend="WHERE">

<isNotNull property="deviceId" prepend="AND"> tdi.deviceId = #deviceId# </isNotNull>

</dynamic>

<dynamic>元素划分出SQL语句的动态部分,动态部分可以包含任意多的条件标签元素,条件标签决定是否在语句中包含其中的SQL代码。所有的条件标签元素将根据传给动态查询Statement的参数对象的情况来工作。<dynamic>元素和条件元素都有"prepend"属性,它是动态SQL代码的一部分,在必要情况下,可以被父元素的"prepend"属性覆盖。"prepend"属性"where"将覆盖第一个为"真"的条件元素,这对于确保生成正确的SQL语句是有必要的。 例如:在第一个为"真"的条件元素中,"AND"是不需要的。

例如:

<dynamic?prepend="WHERE">

<![CDATA[

tam.signalCode <> 0?

]]>

<isNotNull property="sureStatusList" prepend="AND "> tam.sureStatus IN(

? ? <iterate property="sureStatusList" conjunction=",">#sureStatusList[]#</iterate>)

? ? </isNotNull>

</dynamic>

由于"prepend"属性"where"将覆盖第一个为"真"的条件元素,因此拼接之后的sql为:

"WHERE?tam.signalCode <> 0?tam.sureStatus IN()",很明显拼接之后的sql是不对的。

正确的写法为:

?

WHERE 1 = 1?

<dynamic>

<![CDATA[

AND tam.signalCode <> 0?

]]>

<isNotNull property="sureStatusList" prepend="AND "> tam.sureStatus IN(

? ? <iterate property="sureStatusList" conjunction=",">#sureStatusList[]#</iterate>)

?</isNotNull>