Параметризованный оператор 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);