Cassandra 按ASC/DESC列出的Datastax驱动程序映射顺序

Cassandra 按ASC/DESC列出的Datastax驱动程序映射顺序,cassandra,mapping,cql,datastax-java-driver,Cassandra,Mapping,Cql,Datastax Java Driver,假设下一个Cassandra系列: 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":"NO

假设下一个Cassandra系列:

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)。我的助手是下一个:

@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);
}
当我执行:

myTableAccesor accessor = manager.createAccessor(myTableAccesor.class);
然而,极限情况:

@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);
@Query(“从myTable中选择*,其中A=:A和B=:B限制:最大值”)
结果getAllByKey(@Param(“A”)字符串A、@Param(“B”)字符串B、@Param(“max”)字符串max);
工作正常

我认为这个问题与字符串类型有关(可能是一些字符?),但我不确定。有什么办法解决这个问题吗


提前感谢。

不幸的是,在预先准备好的语句中按方向绑定订单(这是访问者使用的)是无效的CQL,就像您可以使用限制一样。作为一种解决方法,您可以创建两个单独的访问器:

@Query(“从myTable中选择*,其中A=:A和B=:B按时间顺序描述”)
结果getAllByKeyDesc(@Param(“A”)字符串A,@Param(“B”)字符串B);
@查询(“从myTable中选择*,其中A=:A和B=:B按时间ASC排序”)
结果getAllByKeyAsc(@Param(“A”)字符串A,@Param(“B”)字符串B);

谢谢@Andy。这是我目前的解决方案,但我想减少查询的数量(到一半:))CQL不允许对ORDER BY子句进行参数化,因此驱动程序实际上没有办法解决这个问题。@AlexPopescu,我认为您可以按聚类顺序参数化ORDER BY,反之亦然(至少在)我很确定协议不允许
SELECT*FROM t ORDER BY fld?
(将ORDER BY子句作为参数传递)。好的@AlexPopescu,我现在理解你了,你说的和Andy响应一样,不是吗?谢谢
@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);