MyBatis - 从单个对象转换查询检查以检查集合

时间:2018-04-30 14:08:15

标签: java mybatis

拥有以下代码。

表中选择一串 ... 左连接 ...

<if test="taskowner != null">
    AND (o.primary_taskowner_id = #{taskowner.id}
         OR o.secondary_taskowner_id = #{taskowner.id})
</if>

在这种情况下, taskowner 是我组合框中的一个选定对象。

要求已更改,现在我需要组合框 - 多选。如何将查询的那一部分调整为组合框多选(我想在集合中的每个对象上运行相同的条件)?

我想出了这个:

<if test="taskowners != null and taskowners.empty == false">

     AND o.primary_taskowner_id 
    <foreach item="taskowner" collection="taskowners" open="(" separator="," close=")">
         #{taskowner.id}
   </foreach>

    OR o.secondary_taskowner_id 
    <foreach item="taskowner" collection="taskowners" open="(" separator="," close=")">
         #{taskowner.id}
    </foreach>
</if> 

但结果不是我所期待的。我尝试了该解决方案的多种变体,但它们都没有奏效。并且没有在网上找到任何有用的东西。

提前致谢。

2 个答案:

答案 0 :(得分:1)

似乎你想要的SQL是这个的变体:

... and
(o.prim_id = '7' or o.second_id = '7') or
(o.prim_id = '8' or o.second_id = '8') or
(o.prim_id = '9' or o.second_id = '9') ...

使用一个foreach循环生成此内容。 MyBatis&#34;代码&#34;会是这样的:

AND
(
<foreach ...blah>
   (o.prim_id = {tid} or o.second_id = {tid})
   <conditional or> (I'm sure mybatis provides this, but I dont remember the syntax.
</foreach>
)

答案 1 :(得分:0)

我找到了解决方案。感谢DwB向我展示了正确的方向。

<if test="taskowners != null and taskowners.empty == false">

    AND (o.primary_taskowner_id IN
    <foreach item="taskowner" collection="taskowners" open="(" separator="," close=")">
        #{taskowner.id}
    </foreach>

    OR o.secondary_taskowner_id IN
    <foreach item="taskowner" collection="taskowners" open="(" separator="," close=")">
        #{taskowner.id}
    </foreach>)
</if>