Как передать массив Integer в IN в MyBatis

В моем Mybatis есть запрос, содержащий предложение IN, которое представляет собой в основном набор идентификаторов (целых)

Теперь я зациклился на том, как передать массив Integer в это подразделение IN так, чтобы он подтягивал нужные записи. Протестировал, передав строку, содержащую ID, в предложение IN, но это не сработало, как ожидалось.

Пример кода ниже

Метод Mybatis с использованием аннотаций

@Select(SEL_QUERY)
    @Results(value = {@Result(property="id",column="ID")})
    List<Integer> getIds(@Param("usrIds") Integer[] usrIds);

Запрос

select distinct ID from table a where a.id in ( #{usrIds} )

Вызов метода

Integer[] arr = new Integer[2];
arr[0] = 1;
arr[1] = 2;

mapper.getIds(arr)

Это не работает, Mybatis выдает ошибку, когда я вызываю метод mapper

Любые предложения, пожалуйста,

Ответы

Ответ 1

myBatis Руководство пользователя по динамическому SQL содержит пример того, как использовать цикл foreach для построения строки запроса, которая работает для списков и массивы.

До выпуска 3.2 вам пришлось использовать конфигурацию xml для использования динамического SQL, а в более новых версиях также можно было бы использовать динамический sql в аннотациях.

<select id="selectPostIn" resultType="domain.blog.Post">
    SELECT *
    FROM POST P
    WHERE ID in
    <foreach item="item" index="index" collection="list"
             open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

Ответ 2

ДА, вы можете сделать это с помощью аннотаций.

Если вы используете postgresql, вы можете сделать это в этом сообщении.

Если вы используете MySQL, попробуйте это изменить в своем примере кода:

Метод Mybatis с использованием аннотаций

@Select(SEL_QUERY)
    @Results(value = {@Result(property="id",column="ID")})
    List<Integer> getIds(@Param("usrIds") String usrIds);

Запрос (с использованием MySQL)

select distinct ID from table a where FIND_IN_SET( a.id, #{usrIds}) <> 0

Вызов метода

Integer[] arr = new Integer[2];
arr[0] = 1;
arr[1] = 2;

String usrIds= "";
for (int id : ids) {
    usrIds += id + ",";
}

mapper.getIds(usrIds)