我最近从mybatis版本2升级到3.3版。 由于mybatis 3.3.0不再支持动态前置,我们尝试替换如下所示:
IOptions
替换为:
version 2 query
delete FROM
Employee
where
ID_UNIQUE_KEY = #{uniqueKey}
<dynamic prepend=" and ID_Employee_CODE not in">
<if test="Employees != null">
<isNotEmpty property="Employees">
<iterate open=" (" close=") " conjunction="," property="Employees">
<if test="Employees[].idEmployeeCode != null">
#{Employees[].idEmployeeCode}
</if>
</iterate>
</isNotEmpty>
</if>
</dynamic>
问题是如果我有一个非空DTO(员工)列表,但是delete FROM
Employee
where
ID_UNIQUE_KEY = #{uniqueKey}
<if test="Employees != null and Employees.size() > 0">
and ID_Employees_CODE not in
<foreach close=")" collection="Employees" index="index" item="item" open="(" separator=",">
<if test="item != null and item.idEmployeeCode != null">
#{item.idEmployeeCode}
</if>
</foreach>
</if>
中使用的dto属性是query(idEmployeeCode)
,那么在这种情况下{ {1}}使用empty()附加到查询中,因此失败了。
我们也可以在java中处理它...在调用这些查询之前。 虽然有任何方法可以在查询中处理它,但考虑到受此影响的查询量很大。
这在动态前置中运行良好。
对此有什么想法吗?
谢谢&amp;问候, 尼基塔
答案 0 :(得分:0)
通过一些重新设计,<trim>
标记可以替代<dynamic>
- 我认为也更容易理解。
试试这个:
delete FROM Employee
where
ID_UNIQUE_KEY = #{uniqueKey}
<if test="Employees != null and Employees.size() > 0">
<trim prefix="and ID_Employees_CODE not in (" suffix=")">
<foreach collection="Employees" index="index" item="item" separator=",">
<if test="item != null and item.idEmployeeCode != null">
#{item.idEmployeeCode}
</if>
</foreach>
</trim>
</if>