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() &gt; 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() &gt; 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>