/ / Cómo pasar una matriz de enteros a la cláusula IN en MyBatis - java, java-ee, mybatis

Cómo pasar una matriz Integer a la cláusula IN en MyBatis - java, java-ee, mybatis

Hay una consulta en mi Mybatis que contiene una cláusula IN que es básicamente un conjunto de Id "s (enteros)

Ahora estoy atascado en cómo puedo pasar una matriz Integera esta cláusula IN para que extraiga los registros adecuados. Se intentó pasar una cadena que contenía las ID "a la cláusula IN, pero esto no funcionó como se esperaba.

Ejemplo de código a continuación

Método Mybatis usando Anotaciones

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

Consulta

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

Método de llamada

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

mapper.getIds(arr)

Esto no funciona, Mybatis emite un error cuando llamo al método del asignador

Cualquier sugerencia por favor

Respuestas

28 para la respuesta № 1

los Guía de usuario de myBatis sobre SQL dinámico tiene un ejemplo sobre cómo usar un bucle foreach para construir la cadena de consulta, que funciona para listas y matrices.

Antes de la versión 3.2, tenía que usar la configuración xml para usar sql dinámico, con versiones más nuevas también debería ser posible usar sql dinámico en anotaciones.

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

3 para la respuesta № 2

SI, puedes hacerlo usando anotaciones.

Si estas usando postgresql, puedes hacer como en este post.

Si estas usando MySQL Prueba estos cambios en tu ejemplo de código:

Método Mybatis usando Anotaciones

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

Consulta (usando MySQL)

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

Método de llamada

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

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

mapper.getIds(usrIds)