Couchbase 参数化 N1QL 查询 IN 语句

Mar*_*unt 1 java couchbase sql++

使用com.couchbase.client, java-client版本2.2.7我一直无法得到一个 n1ql 查询工作,它使用带有多个项目的 IN 语句,请参阅我的示例查询和下面的 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";
Run Code Online (Sandbox Code Playgroud)

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

ids = "'123', '456'";
ids = "\"123\" , \"456\";
ids = "`123`,`456`"; 
Run Code Online (Sandbox Code Playgroud)

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

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

Sim*_*slé 5

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

JsonObject placeHolders = JsonObject.create()
    .put("ids", JsonArray.from("id1", "id2", "id3"))
    .put("startTime", startTime)
    .put("endTime", endTime);
Run Code Online (Sandbox Code Playgroud)