Mybatis动态前置

时间:2018-02-20 11:38:11

标签: dynamic version mybatis prepend

我最近从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() &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),那么在这种情况下{ {1}}使用empty()附加到查询中,因此失败了。

我们也可以在java中处理它...在调用这些查询之前。 虽然有任何方法可以在查询中处理它,但考虑到受此影响的查询量很大。

这在动态前置中运行良好。

对此有什么想法吗?

谢谢&amp;问候, 尼基塔

1 个答案:

答案 0 :(得分:0)

通过一些重新设计,<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>