日期:2014-05-16 浏览次数:20474 次
?
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>