java - stored - mybatis unpooled
Cómo pasar una matriz de enteros a la cláusula IN en MyBatis (2)
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 Integer a esta cláusula IN para que recupere los registros adecuados. Se intentó pasar una cadena que contiene los 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 produce un error cuando llamo al método del asignador
Cualquier sugerencia por favor
La Guía de usuario myBatis sobre Dynamic SQL 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 las 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>
SI, puedes hacer eso usando anotaciones.
Si estás usando postgresql , puedes hacer lo mismo en esta publicación .
Si está utilizando MySQL, intente estos cambios en el 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)