2016-08-02 2 views
1

Использование com.couchbase.client, java-client версии 2.2.7 я не смог получить n1ql работу запроса, который использует оператор IN с несколько элементов см мой пример запроса и Java код нижеCouchbase параметрироваться N1QL запрос В заявлении

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?

+0

неуместны скобки должны быть «и (идентификатор ([$ ид])) « – Stavm

ответ

4

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

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

Эй, Саймон, вы можете взглянуть на этот вопрос http://stackoverflow.com/questions/38845615/n1ql-query-times-out-on-aws-server couchbase collectInfo журналы здесь https: //s3.amazonaws .com/cb-customers/TE2/спасибо заранее. –

+0

Как установить такой заполнитель в Spring Data? например. У меня есть: '@Query ("# {#} n1ql.selectEntity использовать клавиши $ иды") Коллекция findByIdIn (@param ("иды") Список идентификаторов);' но называть его через Http я получаю ' "неподдерживаемый тип для JsonArray: класс java.util.ArrayList" ' единственный способ, которым я мог бы сделать его работать: ' @Query ("# {#} n1ql.selectEntity использовать клавиши $ ИДС") Коллекция findByIdIn (@Param ("ids") JsonArray ids); ' , а затем определяет пользовательский объектMapper, чтобы получить JsonArray от остального вызова. Есть ли способ лучше? – rashtao

+0

Я имею в виду использование @RepositoryRestResource – rashtao

Смежные вопросы