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

2022-09-01 12:58:35

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

我现在被困在如何将整数数组传递给这个IN子句,以便它拉出正确的记录。尝试将包含ID的字符串传递给IN子句,但这没有按预期工作。

下面的代码示例

使用注释的米巴蒂斯方法

@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抛出错误

任何建议请


答案 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,请尝试在代码示例中进行以下更改:

使用注释的米巴蒂斯方法

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

推荐