Параметризованный оператор Couchbase N1QL IN

С помощью 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";

Я пытался установить ids используя ('), (") и (`), такие как:

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

Ни один из них не работает, когда есть несколько идентификаторов, однако, если есть только один, такой как ids = "'123'" это работает отлично. Также мой запрос работает, если я использую его, используя CBQ на терминале.

Мой вопрос заключается в следующем: как создать параметризованный запрос N1QL, который может содержать несколько элементов в выражении IN?

1 ответ

Решение

Снятие скобок вокруг $ids в заявлении и положить фактические идентификаторы в placeholders как JsonArray объект должен работать:

JsonObject placeHolders = JsonObject.create()
    .put("ids", JsonArray.from("id1", "id2", "id3"))
    .put("startTime", startTime)
    .put("endTime", endTime);
Другие вопросы по тегам