带有限制的Cassandra BoundStatement

Ser*_*scu 3 java cassandra datastax-java-driver datastax

我正在使用PreparedStatement和BoundStatement来执行一些Cassandra查询.问题是,我试图对这些使用限制.这就是我所拥有的:

 selectByDatasetIdAndTimePreparedStatement = getSession().prepare(
                QueryBuilder.select()
                        .all()
                        .from(KEYSPACE_NAME, TABLE_NAME)
                        .where(QueryBuilder.eq(AFFILIATION_ID_COLUMN, QueryBuilder.bindMarker()))
                        .and(QueryBuilder.eq(DATASET_ID_COLUMN, QueryBuilder.bindMarker()))
                        .and(QueryBuilder.lte(TIME_COLUMN, QueryBuilder.bindMarker()))
                        //.limit(QueryBuilder.bindMarker())
        );
Run Code Online (Sandbox Code Playgroud)

每当我需要运行查询时,我都会调用此函数:

public Statement buildSelectByDatsetIdAndTimePreparedStatment(String affiliationId, String datasetId, Long time, int limit)
{
    BoundStatement boundStatement = selectByDatasetIdAndTimePreparedStatement
            .bind()
            .setString(AFFILIATION_ID_COLUMN, affiliationId)
            .setString(DATASET_ID_COLUMN, datasetId)
            .setLong(TIME_COLUMN, time);
    databaseManager.applyReadStatementsConfiguration(boundStatement);
    return boundStatement;
}
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于第一个代码段中没有limit子句的情况.我不知道如何在第二个片段中指定限制.我不想使用字符串之类的东西

databaseManager.getSession().execute("SELECT * FROM myTable where ... limit 10);
Run Code Online (Sandbox Code Playgroud)

有没有办法使用BoundStatement来做到这一点?我没有看到类似BoundStatement.limit()或setLimit()的内容.

谢谢,塞尔班

Oli*_*lat 7

最简单的方法是使用命名标记作为限制:

PreparedStatement pst = session.prepare(
        select().all()
                .from("foo")
                .where(eq("k", bindMarker()))
                .limit(bindMarker("l")));     // here

session.execute(pst.bind()
        .setInt("k", 1)
        .setInt("l", 10));
Run Code Online (Sandbox Code Playgroud)

您还可以保留匿名标记并使用位置设置器:

                .where(eq("k", bindMarker()))
                .limit(bindMarker())); // no name
session.execute(pst.bind()
        .setInt(0, 1)
        .setInt(1, 10));
Run Code Online (Sandbox Code Playgroud)

对于记录,当您使用匿名标记时,Cassandra会自动为它们命名.对于列,这些是列名称(您的示例依赖于该列),并且对于限制,结果是[limit].所以这也有效:

                .where(eq("k", bindMarker()))
                .limit(bindMarker())); // no name
session.execute(pst.bind()
        .setInt("k", 1)
        .setInt("[limit]", 10));
Run Code Online (Sandbox Code Playgroud)

如有疑问,您可以检查预准备语句的元数据以查看其预期内容:

for (ColumnDefinitions.Definition v : pst.getVariables()) {
    System.out.printf("%s %s%n", v.getName(), v.getType().getName());
}
Run Code Online (Sandbox Code Playgroud)

我个人喜欢明确的命名标记,但是YMMV.