Как передать Integer Array в предложение IN в MyBatis

java java-ee mybatis

42099 просмотра

3 ответа

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

Теперь я застрял на том, как я могу передать массив Integer в это предложение IN, чтобы он собирал правильные записи. Попытался передать строку, содержащую идентификаторы, в предложение 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

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

Автор: Vivek Источник Размещён: 12.11.2019 09:10

Ответы (3)


31 плюса

Решение

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

До выпуска 3.2 для использования динамического sql приходилось использовать конфигурацию xml, а в более новых версиях также можно было использовать динамический 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>
Автор: Jörn Horstmann Размещён: 06.01.2012 12:29

6 плюса

ДА, вы можете сделать это, используя аннотации.

Если вы используете 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) 
Автор: Italo Borssatto Размещён: 09.02.2012 04:40

0 плюса

Вы можете создать новый обработчик типов и использовать его только для вашего параметра. Запрос изменится на:

SELECT ... WHERE FIND_IN_SET(id, #{usrIds, typeHandler=my.pkg.ListTypeHandler}) <> 0

И обработчик типа:

import java.sql.PreparedStatement;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.ObjectTypeHandler;

import com.google.common.base.Joiner;

public class ListTypeHandler extends ObjectTypeHandler {
    @Override
    public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
        ps.setObject(i, Joiner.on(",").join((Iterable<?>) parameter), JdbcType.OTHER.TYPE_CODE);
    }
}
Автор: Italo Borssatto Размещён: 08.03.2019 07:33
Вопросы из категории :
32x32