【问题标题】:How to pass a list in an @Query for an SQL that uses IN?如何在@Query 中为使用 IN 的 SQL 传递列表?
【发布时间】:2022-10-12 22:21:03
【问题描述】:

在 Java 中,使用 Azure Cosmos Query 注释,我试图提取 ID 与提供的 ID 之一匹配的数据:

@Query("SELECT * FROM c WHERE c.id IN (@ids)")
List<Object> getItems(@Param("ids") String ids);

例如

SELECT * FROM c WHERE c.id IN ("111", "222", "333")

我不能将 ID 作为 List 传递,或者直接将 List 转换为 String,因为它将包含方括号 [] 作为搜索条件的一部分,并且它也将被视为一个项目,而不是一个数组项目。

参考以下解决方案here,我尝试将列表转换为字符串,然后操作字符串,使其以逗号分隔的方式在每个项目周围包含引号。但是,即使列表中只有一项,它也不返回任何数据。单引号和双引号都是这种情况。

这是我目前从 List 到 String 的解决方案:

String ids= list.stream().map(s -> "'" + s + "'").collect(Collectors.joining(","));

在 Java 中,如何在 @Query 中为使用 IN 的 SQL 传递一个列表?

【问题讨论】:

  • List&lt;Object&gt; getItems(@Param("ids") List&lt;*class of the ids*&gt; ids);
  • @Jens 我试过了,它不起作用,不返回任何结果
  • 没有结果并不意味着它不起作用。你确定你应该得到一个结果。您是否查看过日志文件,生成的查询是什么样的?
  • 我一直在尝试修改我的 application.yml 以在日志中显示这一点。我还没有找到正确的设置。
  • @Kurtiss - 太好了,你正在使用array_contains() - 如果你还没有提到它,我会建议它。仅供参考,我发布了一些与array_contains() 相关的答案,包括this one - 该特定答案说明了一个标量数组 - 您也可以将它与对象数组一起使用。

标签: java azure-cosmosdb


【解决方案1】:

IN 更改为Array_Contains

SELECT * FROM c WHERE Array_Contains(@ids, ids))

【讨论】:

    猜你喜欢
    • 2014-07-16
    • 2019-04-03
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多