MyBatis - конвертировать запрос-проверку из одного объекта для проверки коллекции - PullRequest
0 голосов
/ 30 апреля 2018

Иметь следующий кусок кода.

Выберите связка столбцов из таблицы , где ... левое соединение ... , где

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

В этом случае владелец задачи - это один выделенный объект в моем поле со списком .

Требования изменились, и теперь мне нужно combo box-multi select . Как я могу настроить этот фрагмент запроса для комбинированного выбора нескольких полей (я хочу выполнить то же условие, но для каждого объекта в коллекции)?

Я придумал это:

<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 голосов
/ 03 мая 2018

Я нашел решение. Спасибо 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>
0 голосов
/ 30 апреля 2018

Кажется, что 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 будет выглядеть примерно так:

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>
)
...