【问题标题】:Couchbase parameterized N1QL query IN statementCouchbase 参数化 N1QL 查询 IN 语句
【发布时间】:2016-08-02 04:49:47
【问题描述】:

使用com.couchbase.client, java-client 版本2.2.7 我无法使使用包含多个项目的IN 语句的n1ql 查询正常工作,请参阅下面的示例查询和java 代码

public int getCountForDuration(Long startTime, Long endTime, String ids){
    JsonObject placeHolders = JsonObject.create().put("ids", ids).put("startTime", startTime).put("endTime", endTime);
    N1qlQuery query = N1qlQuery.parameterized(COUNT_STATEMENT, placeHolders)            
    N1qlQueryResult result = bucket.query(query);
    ...
}

public static final String COUNT_STATEMENT = "select count(*) as count " +
            "from bucketName " +
            "where docType = 'docId' " +
            "and (id IN [$ids]) " + <----- OFFENDING LINE
            "and publishTimestamp between $startTime and $endTime";

我尝试使用 (')、(") 和 (`) 设置 ids,例如:

ids = "'123', '456'";
ids = "\"123\" , \"456\";
ids = "`123`,`456`"; 

当有多个 id 时,这些都不起作用,但是如果只有一个,例如ids = "'123'",它就可以正常工作。如果我在终端上使用 CBQ 使用它,我的查询也有效。

我的问题是如何创建一个参数化的 N1QL 查询 一个 IN 语句可以包含多个项目吗?

【问题讨论】:

  • 放错方括号应该是“and (id IN ([$ids]) )”

标签: java couchbase n1ql


【解决方案1】:

删除语句中 $ids 周围的括号并将实际 ID 作为 JsonArray 对象放入 placeholders 应该可以:

JsonObject placeHolders = JsonObject.create()
    .put("ids", JsonArray.from("id1", "id2", "id3"))
    .put("startTime", startTime)
    .put("endTime", endTime);

【讨论】:

  • 嘿西蒙你能看看这个问题stackoverflow.com/questions/38845615/… couchbase collectInfo 日志在这里s3.amazonaws.com/cb-customers/TE2提前谢谢。
  • 如何在 Spring Data 中设置这样的占位符?例如。我有:@Query("#{#n1ql.selectEntity} USE KEYS $ids") Collection&lt;User&gt; findByIdIn(@Param("ids") List ids);,但通过 Http 调用它我得到"Unsupported type for JsonArray: class java.util.ArrayList",唯一能让它工作的方法是:@Query("#{#n1ql.selectEntity} USE KEYS $ids") Collection&lt;User&gt; findByIdIn(@Param("ids") JsonArray ids);,然后定义一个自定义 objectMapper 以从休息调用中获取 JsonArray。有没有更好的办法?
  • 我的意思是使用@RepositoryRestResource
  • 如果你只是做一个普通的 USE KEYS 那么你不妨使用 CrudRepository 的findAll(Iterable) 方法
  • 我使用的查询只是为了举例。一般来说,我可以有自定义查询,我需要将来自@RepositoryRestResource 中的http 调用的Iterable 映射到查询参数。所以目前我认为没有办法让它工作(其他使用自定义 objectMapper)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多