2015-07-09 3 views
2

Пусть следующий Cassandra ColumnFamily:Datastax Mapping Driver ORDER BY ASC/DESC

CREATE TABLE myTable (
    A text, 
    B text, 
    time timestamp, 
    PRIMARY KEY ((A, B), time) 
) WITH CLUSTERING ORDER BY (time ASC) 
    AND bloom_filter_fp_chance = 0.01 
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}' 
    AND comment = '' 
    AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'} 
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'} 
    AND dclocal_read_repair_chance = 0.1 
    AND default_time_to_live = 0 
    AND gc_grace_seconds = 864000 
    AND max_index_interval = 2048 
    AND memtable_flush_period_in_ms = 0 
    AND min_index_interval = 128 
    AND read_repair_chance = 0.0 
    AND speculative_retry = '99.0PERCENTILE'; 

Мне нужно выполнить следующую CQL 3 запроса:

SELECT * FROM myTable WHERE A='aaaaa' AND B='bbbbb' ORDER BY time DESC 

(который отлично работает в CQL консоли) по используя сопоставление драйверов Datastax (cassandra-driver-mapping-2.1.6). Мой Accesor является следующий:

@Accessor 
public interface myTableAccesor { 

    @Query("SELECT * FROM myTable WHERE A=:A AND B=:B ORDER BY time :order") 
    Result<myTable> getAllByKey(@Param("A") String A, @Param("B") String B, @Param("order") String order); 
} 

Но я получаю следующее исключение:

java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.SyntaxError: line 1:136 missing EOF at ':' (...=:B ORDER BY time [:]order) 

когда я исполню:

myTableAccesor accessor = manager.createAccessor(myTableAccesor.class); 

Однако случай LIMIT:

@Query("SELECT * FROM myTable WHERE A=:A AND B=:B LIMIT :max") 
     Result<myTable> getAllByKey(@Param("A") String A, @Param("B") String B, @Param("max") String max); 

работает правильно.

Я думаю, что проблема связана со строковым типом (может быть, с некоторым символом?) Но я не уверен. Есть ли способ решить это?

Заранее спасибо.

ответ

2

К сожалению, недействительно CQL для привязки в направлении ORDER BY в подготовленном заявлении (которое использует Аксессоры), как вы можете с помощью LIMIT. В качестве обходного пути вы можете создать два отдельных устройства доступа:

@Query("SELECT * FROM myTable WHERE A=:A AND B=:B ORDER BY time DESC") 
Result<myTable> getAllByKeyDesc(@Param("A") String A, @Param("B") String B); 

@Query("SELECT * FROM myTable WHERE A=:A AND B=:B ORDER BY time ASC") 
Result<myTable> getAllByKeyAsc(@Param("A") String A, @Param("B") String B); 
+0

спасибо @ Энди. Это мое текущее решение, но я хотел уменьшить количество запросов (до половины :)) – Amanda

+0

CQL не позволяет параметризовать предложение ORDER BY, поэтому у драйвера нет способа решить эту проблему. –

+0

@AlexPopescu, я думаю, что вы можете параметризовать ORDER BY, упорядочивая порядок и обратную сторону этого (по крайней мере, в [CQL3] (https://cassandra.apache.org/doc/cql3/CQL.html#selectStmt)) – Amanda

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