gpt4 book ai didi

java - 使用mybatis注释在IN子句中传递多个值

转载 作者:行者123 更新时间:2023-12-01 07:50:42 25 4
gpt4 key购买 nike

我试图在由 IN 子句组成的 SELECT QUERY 中传递多个值。我想使用 mybatis 执行以下查询:

SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in  (#{childScanIDs})

其中 childScanIDs变量由多个逗号分隔的值组成。我将这些值作为字符串传递,其中包含所有用逗号分隔的值。以下是映射器接口(interface)中使用的方法。

@Select(getDifferencesByScanIDs)
@Results({
@Result(property="owner", column="OWNER"),
@Result(property="comparisonName", column="COMPARISON_NAME"),
@Result(property="scanID", column="SCAN_ID"),
@Result(property="localRowID", column="LOCAL_ROWID"),
@Result(property="remoteRowID", column="REMOTE_ROWID"),
@Result(property="indexValue", column="INDEX_VALUE"),
@Result(property="status", column="STATUS"),
@Result(property="lastUpdateTime", column="LAST_UPDATE_TIME")
})
List<Difference> getDifferencesByScanIDs(@Param("childScanIDs") String childScanIDs);

我以这种方式构造值字符串:

String scanIDs = StringUtils.join(cmp.getChildScanIDs(), ",");

执行该函数时,会引发此异常。

### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: ORA-01722: invalid number

### The error may involve com.rs2.automation.soacomparison.dao.differences.DifferencesMapper.getDifferencesByScanIDs-Inline
### The error occurred while setting parameters
### Cause: java.sql.SQLSyntaxErrorException: ORA-01722: invalid number

如有任何帮助,我们将不胜感激。我认为问题在于 mybatis 没有将这些值识别为单独的数字。另一个解决方案是对每个数字执行查询,但我想立即传递所有值。提前致谢。

最佳答案

SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in  (#{childScanIDs})

如果我们想象一个像 2, 13, 15, 16 这样的列表,这个查询将导致:

SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in  ('2,13,15,16')

如您所见,该值被视为 String 而不是列表,这不是您所需要的。

我会将cmp.getChildScanIDs()传递给mybatis,而不将其转换为字符串,并使用mybatis的动态sql。

将方法编辑为:

List<Difference> getDifferencesByScanIDs(@Param("childScanIDs") List<Integer> childScanIDs); // or int[]

将查询编辑为:

SELECT * FROM DBA_COMPARISON_ROW_DIF WHERE SCAN_ID in 
<foreach item="item" index="index" collection="childScanIDs" open="(" separator="," close=")">
#{item}
</foreach>
<小时/>

它的作用:

  • :启动 foreach 循环
  • item:循环内当前对象的名称
  • index:索引变量(本例中并不真正需要)
  • collection:集合的名称(根据您在映射器接口(interface)中的定义)
  • open:在第一次迭代之前插入的字符串
  • close:最后一次迭代后插入的字符串
  • 分隔符:在一个元素和另一个元素之间插入的字符串
  • #{item}:打印当前项目

引用链接:MyBatis Dynamic SQL

关于java - 使用mybatis注释在IN子句中传递多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com