2016-09-26 1 views
1

Я пытаюсь запросить Cassandra с запросом на основе временного интервала, и я запускаю InvalidQueryException при выполнении запроса с моей службы Java.Ошибка Java CQL Invalid Query Exception при запросе Timestamp

Скажем, у меня есть следующая схема:

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

Использование cqlsh Я могу запросить следующим образом:

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

В моей службе Java, следующий код генерирует InvalidQueryException

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

    session.execute(select); 

Исправлена ​​ошибка:

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) 

При попытке выполнить запрос как String, а не Statement, он отлично работает. Вот пример.

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

пара вопросов:

  1. Почему я получаю исключение, говоря «ожидаемый 8 или 0 байт долго даты»? CQL documentation говорит, что мы можем ввести временную метку как integer или String.
  2. Что мне нужно сделать, чтобы мой запрос работал с использованием класса Statement? Мой сервис получает отметку времени в формате Date ISO 8601.
+0

Здравствуйте, вы нашли, как это исправить? Недавно я столкнулся с той же проблемой, которая очень расстраивает. Тот же запрос выполняется в cqlsh, но не запускается из программы. Если я скопирую журнал отладки формы запроса и вставляю в cqlsh, он работает отлично ... – Raj

ответ

0

Мне удалось заставить это работать, преобразовывая его в строку перед выполнением.

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

Только так я могу заставить его работать со временными метками.

Это будет работать, если вам нужно только использовать дату в где п ...

Select in Cassandra with Java (datastax driver) by timestamp