【问题标题】:Java API to use for queries based on maxTimeuuid and minTimeuuid用于基于 maxTimeuuid 和 minTimeuuid 的查询的 Java API
【发布时间】:2013-11-18 18:44:39
【问题描述】:

使用基于 maxTimeuuid 和 minTimeuuid 的查询的 Java API 是什么?我在 QueryBuilder 或其他任何地方都找不到。我正在使用 DataStax 客户端

        <artifactId>cassandra-driver-core</artifactId>
        <version>1.0.3</version>

表“a”有 2 列: 1.字符串类型的id 2. TimeUuid 类型的LMD

这是我正在做的,看起来不对,当然也行不通

    Query q = QueryBuilder
    .select()
    .all()
    .from("test","a")
    .where().and(QueryBuilder.gt("LMD", "minTimeUUid('2013-11-03 14:33:50')"))
    .and(QueryBuilder.lt("LMD", "maxTimeUUId('2013-11-03 14:45:50')"));

任何指针都非常感谢

谢谢

【问题讨论】:

    标签: java cassandra cql3 datastax-java-driver


    【解决方案1】:

    您需要使用utils.UUIDs 实用程序类从时间戳以编程方式生成最大/最小 TimeUUID,例如

    final UUID min = UUIDs.startOf(lowerTimeStamp);
    final UUID max = UUIDs.endOf(upperTimeStamp);
    Query q = QueryBuilder
      .select()
      .all()
      .from("test","a")
      .where(QueryBuilder.gt("LMD", min))
      .and(QueryBuilder.lt("LMD", max));
    

    【讨论】:

    • 感谢 lorcan 的洞察力。查询不会按原样工作。您是否知道我们如何使用 java api 添加“允许过滤”?我知道这是 Select 类的一部分,但基于 QueryBuilder...怎么做?
    • 我稍微编辑了一下(删除了空的where 调用)。你有更多关于这个错误的信息吗?
    • 是:这是我执行时的错误:无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能。如果您想在性能不可预测的情况下执行此查询,请使用 ALLOW FILTERING
    • 啊,您需要包含主键 - 您可以将表定义粘贴到您的问题中吗?
    • @Masti,在拨打where()之前尝试拨打allowFiltering()
    【解决方案2】:

    对于更高版本的 datastax java 驱动程序,您可以使用 QueryBuilder.fcall 之类的(这里我假设静态导入 QueryBuilder.*):

    Query q = select()
      .all()
      .from("test","a")
      .where(gt("LMD", fcall("minTimeUuid", lowerTimeStamp)))
      .and(lt("LMD", fcall("minTimeUuid", upperTimeStamp)));
    

    但是对于第二个参数(在这种情况下为long)使用正确的数据类型是很重要的。

    驱动的V4甚至还有QueryBuilder.minTimeUuid()QueryBuilder.maxTimeUuid()方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多