2016-09-26 6 views
1

Ich versuche, Cassandra mit einer Zeitspanne Abfrage abzufragen, und ich bin schlage eine InvalidQueryException wenn die Abfrage von meinem Java-Dienst ausgeführt wird.Java CQL Treiber Ungültige Abfrageausnahme bei der Abfrage Zeitstempel

Lassen Sie uns sagen, dass ich das folgende Schema haben:

CREATE TABLE user (
    user_id uuid, 
    ts timestamp, 
    data text, 
    PRIMARY KEY (user_id, ts) 
) 

cqlsh Mit ich in der Lage bin Abfrage wie folgt:

SELECT * FROM user WHERE user_id = c37d661d-7e61-49ea-96a5-68c34e83db3a AND Time >= '2016-09-26T16:39:15+0000'; 

In meinem Java-Dienst, der folgende Code führt ein InvalidQueryException

Statement select = QueryBuilder.select().all() 
        .from(keyspace, tableName) 
        .where(eq("user_id", userUUID)) 
        .and(gte("ts", startTime)); 

    session.execute(select); 

Der Fehler ausgelöst wird:

SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.datastax.driver.core.exceptions.InvalidQueryException: Expected 8 or 0 byte long for date (24)] with root cause 
com.datastax.driver.core.exceptions.InvalidQueryException: Expected 8 or 0 byte long for date (24) 

Wenn ich versuche, die Abfrage als String auszuführen anstatt eine Statement, es funktioniert gut. Hier ist ein Beispiel.

String query = "SELECT * FROM user WHERE user_id = c37d661d-7e61-49ea-96a5-68c34e83db3a AND ts >= '2016-09-26T16:39:15+0000';"; 

Ein paar Fragen:

  1. Warum eine Ausnahme erhalte ich "Expected 8 oder 0 Byte lang für date" zu sagen? Die CQL documentation sagt, dass wir den Zeitstempel als integer oder String eingeben können.
  2. Was muss ich tun, tun meine Frage zu bekommen arbeiten, um die Statement-Klasse? Mein Dienst erhält den Zeitstempel im Format Date ISO 8601.
+0

Hallo, haben Sie, wie dieses Problem beheben? Ich bin in letzter Zeit auf dasselbe Problem gestoßen, was sehr frustrierend ist. Die gleiche Abfrage wird in cqlsh ausgeführt, wird aber nicht vom Programm ausgeführt. Wenn ich das Debugprotokoll der Abfrageform kopiere und in cqlsh einfüge, läuft es gut ... – Raj

Antwort

0

Ich war in der Lage, dies zu tun, indem ich es in eine Zeichenfolge konvertiert, bevor ich ausführe.

Results = cassandraSession.execute(cqlStatement.toString()); 

Nur so könnte ich es mit Zeitstempeln arbeiten.

Das funktioniert, wenn Sie nur das Datum in der where-Klausel verwenden müssen ...

Select in Cassandra with Java (datastax driver) by timestamp

Verwandte Themen