我的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会抛出错误
请提出任何建议
答案 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 将是此迭代中检索到的元素