如何将整数数组传递给MyBatis中的IN子句

时间:2012-01-06 07:39:42

标签: java java-ee mybatis

我的Mybatis中有一个包含IN子句的查询,该子句基本上是一组Id(整数)

我现在停留在如何将一个Integer数组传递给这个IN子句,以便它提取正确的记录。通过将包含ID的String传递给IN子句,但这没有按预期工作。< / p>

以下代码示例

使用注释的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)

这不起作用,当我调用mapper方法时,Mybatis会抛出错误

请提出任何建议

4 个答案:

答案 0 :(得分:31)

myBatis User Guide on Dynamic SQL有一个关于如何使用foreach循环来构建查询字符串的示例,该字符串适用于列表和数组。

在3.2版之前,你必须使用xml配置来使用动态sql,对于更新的版本,它也应该可以使用dynamic sql in annotations

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

答案 1 :(得分:6)

是的,你可以使用注释来做到这一点。

如果您使用 postgresql ,则可以执行in this post

如果您正在使用 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) 

答案 2 :(得分:0)

您可以创建一个新的类型处理程序,并将其仅用于您的参数。查询将更改为:

bindkey -L

和类型处理程序:

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

答案 3 :(得分:0)

List distinctID = (List) getSqlSession().selectOne("dataMapper.getUniqueData", uniqueIDList);

发送唯一ID列表

<select id="getUniqueData" resultType="List">
     select distinct ID from table a where a.id in 
      <foreach item="item" index="index" collection="list"
          open="(" separator="," close=")">
            #{item}
      </foreach>
</select>

使用列表时,索引将是当前迭代的数量,值 item 将是此迭代中检索到的元素