Mybatis 动态前置
Mybatis Dynamic Prepend
最近从mybatis 2升级到3.3。
由于mybatis 3.3.0不再支持dynamic prepend,我们尝试如下替换:
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>
替换为:
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)
中使用的 dto 的属性是 null
,那么在那个case AND clause( and ID_Employees_CODE not in)
使用空 () 附加到查询,因此失败。
我们也可以在 java 中处理它......在调用这些查询之前。
虽然有什么办法可以在查询中处理它,但考虑到受此影响的查询量很大。
这与动态前置一起工作正常。
对此有什么想法吗?
感谢和问候,
尼基塔
加上一点 re-engineering,<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>
最近从mybatis 2升级到3.3。 由于mybatis 3.3.0不再支持dynamic prepend,我们尝试如下替换:
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>
替换为:
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)
中使用的 dto 的属性是 null
,那么在那个case AND clause( and ID_Employees_CODE not in)
使用空 () 附加到查询,因此失败。
我们也可以在 java 中处理它......在调用这些查询之前。 虽然有什么办法可以在查询中处理它,但考虑到受此影响的查询量很大。
这与动态前置一起工作正常。
对此有什么想法吗?
感谢和问候, 尼基塔
加上一点 re-engineering,<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>