Couchbase参数化了N1QL查询IN语句

时间:2016-08-02 04:49:47

标签: java couchbase n1ql

使用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";

我尝试使用(&#39;),(&#34;)和(`)设置ids,例如:

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

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

  

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

1 个答案:

答案 0 :(得分:4)

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

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