【问题标题】:Datastax Driver Mapping ORDER BY ASC/DESCDatastax 驱动程序映射 ORDER BY ASC/DESC
【发布时间】:2015-09-27 15:08:21
【问题描述】:

假设下一个 Cassandra ColumnFamily:

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);
}

但我得到了下一个异常:

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);

正常工作。

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

提前谢谢你。

【问题讨论】:

    标签: cassandra mapping cql datastax-java-driver


    【解决方案1】:

    不幸的是,在准备好的语句(访问器使用的)中的 ORDER BY 方向上绑定是无效的 CQL,就像您可以使用 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);
    

    【讨论】:

    • 感谢@Andy。这是我目前的解决方案,但我想减少查询数量(减少一半:))
    • CQL 不允许对 ORDER BY 子句进行参数化,因此驱动程序实际上没有办法解决这个问题。
    • @AlexPopescu,我认为您可以通过聚类顺序和相反的顺序来参数化 ORDER BY(至少在 CQL3 中)
    • 我很确定协议不允许SELECT * FROM t ORDER BY fld ?(将 order by 子句作为参数传递)。
    • 好的@AlexPopescu,我现在明白你的意思了,你说的和安迪的反应一样,不是吗?谢谢。
    猜你喜欢
    • 2020-02-19
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多