Как передать массив 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)