2016-02-11 2 views
2

Я пытаюсь сделать SELECT в java в моей базе данных Cassandra. Я пытаюсь его:Выберите в Cassandra с Java (драйвер datastax) по timestamp

Statement statement = QueryBuilder.select() 
     .all() 
     .from(keySpaceName, tableName)      
     .where((QueryBuilder.eq("asset", categoryPos))) 
     .and(QueryBuilder.gte("date", "2006-06-08 00:00:00")) 
     .limit(10) 
     .allowFiltering() 
     .enableTracing(); 

The CQL запроса (уже работает) является

SELECT * FROM pair_tick.price WHERE asset = 1 and date>='2006-06-08 15:30:00' LIMIT 10; 

Когда я пытаюсь выполнить этот запрос, я получаю эту ошибку:

The RuntimeException could not be mapped to a response, re-throwing to the HTTP container 
com.datastax.driver.core.exceptions.InvalidQueryException: Expected 8 or 0 byte long for date (10) 
at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:50) 
at com.datastax.driver.core.DriverThrowables.propagateCause(DriverThrowables.java:37) 
at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:244) 
at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:55) 
at com.nexow.services.HistoricService.getHistoric(HistoricService.java:86) 
at com.nexow.HistoricController.getHistoric(HistoricController.java:38) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) 
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 

Как может избежать этой ошибки? Спасибо заранее!

+2

Какая у вас колонка? Если это дата (timestamp Cassandra type), то вы должны предоставить java.util.Date для вашего запроса. Проверьте: https://docs.datastax.com/en/developer/java-driver/1.0/java-driver/reference/javaClass2Cql3Datatypes_r.html –

+1

Мне любопытно, почему у вас есть 'allowFiltering()' в этом утверждении? Если это так, потому что 'date' не является частью вашего первичного ключа, вы должны подумать об изменении своей модели и использовании ее (' date') в качестве ключа кластеризации. Если 'date' уже является частью первичного ключа, я думаю,' allowFiltering() 'бесполезен. – grzesiekw

ответ

2

Я считаю, что проблема заключается в том, как драйвер преобразует ваше значение даты.

Как указано в драйвере DataStax 3,0 (http://docs.datastax.com/en/developer/java-driver/3.0/java-driver/reference/javaClass2Cql3Datatypes.html?scroll=cql-java-types) есть новый класс для обработки типа даты Кассандры, это com.datastax.driver.core.LocalDate класса, так что вы должны использовать этот класс, как пример ниже:

// 1. convert your string date to LocalDate 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
LocalDate localDate = LocalDate.fromMillisSinceEpoch(sdf.parse("2006-06-08").getTime()); 

// 2. then pass it to your query 
Statement statement = QueryBuilder.select() 
    .all() 
    .from(keySpaceName, tableName)      
    .where((QueryBuilder.eq("asset", categoryPos))) 
    .and(QueryBuilder.gte("date", localDate) 
    .limit(10) 
    .allowFiltering() 
    .enableTracing(); 

Драйвер инкапсулирует их в LocalDate, потому что это громоздко для работы с необработанными литералами даты (особенно, поскольку Java не имеет целых без знака), класс LocalDate стремится скрыть всю сложность методов утилиты для преобразования экземпляров LocalDate в целые числа и из них представляя число дней с эпохи.

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