2016-08-02 25 views
1

Mit com.couchbase.client, java-client Version 2.2.7 Ich habe es nicht gelungen, eine n1ql Abfrage Funktion zu erhalten, die eine IN-Anweisung mit mehreren Artikel finden Sie in meinem Beispiel Abfrage und Java-Code verwendet unterCouchbase parametriert N1QL Abfrage IN Anweisung

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

Ich habe versucht, Einstellung ids (') verwendet wird, (") und (`), wie:.

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

Keine von diesen arbeiten, wenn es jedoch mehrere IDs, wenn es nur eine wie ids = "'123'" ist es gut funktioniert auch meine Abfrage funktioniert wenn ich es benutze CBQ auf dem Terminal.

Meine Frage ist, wie kiste ich eine parametrisierte N1QL-Abfrage, die mehrere Elemente in einer IN-Anweisung nehmen kann?

+0

die Klammern verlegt sein sollte „und (id IN ([$ ids])) " – Stavm

Antwort

4

Entfernen der Klammern um die $ids in der Aussage und setzen die tatsächlichen IDs in placeholders als JsonArray Objekt funktionieren sollte:

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

Hey Simon können Sie einen Blick auf diese Frage http://stackoverflow.com/questions/38845615/n1ql-query-times-out-on-aws-server Couchbase collectInfo Protokolle hier https: //s3.amazonaws .com/cb-customers/TE2/Danke im Voraus. –

+0

Wie setze ich einen solchen Platzhalter in Spring Data? z. Ich habe: '@Query ("# {# n1ql.selectEntity} USE KEYS $ ids") Collection findByIdIn (@param ("IDs") Liste ids);' aber es via Http Aufruf ich ' "Nicht unterstützter Typ für JsonArray: Klasse java.util.ArrayList" ' die einzige Art, wie ich es machen könnte Arbeit ist: ' @Query ("# {# n1ql.selectEntity} USE KEYS $ ids") Collection findByIdIn (@Param ("ids") JsonArray ids; ' und dann einen benutzerdefinierten objectMapper definieren, um ein JsonArray von einem Ruheaufruf zu erhalten. Gibt es einen besseren Weg? – rashtao

+0

Ich meine @RepositoryRestResource verwenden – rashtao