我正在使用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())
);
每当我需要运行查询时,我都会调用此函数:
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;
}
但是,这仅适用于第一个代码段中没有limit子句的情况 . 我不知道如何在第二个片段中指定限制 . 我不想使用字符串之类的东西
databaseManager.getSession().execute("SELECT * FROM myTable where ... limit 10);
有没有办法使用BoundStatement?我没有看到像BoundStatement.limit()或setLimit()这样的东西 .
谢谢,塞尔班
1 回答
最简单的方法是使用命名标记作为限制:
您还可以保留匿名标记并使用位置设置器:
对于记录,当您使用匿名标记时,Cassandra会自动命名它们 . 对于列,这些是列名称(您的示例依赖于该列),对于限制,它最终为
[limit]
. 所以这也有效:如有疑问,您可以检查预准备语句的元数据以查看其预期内容:
我个人喜欢明确的命名标记,但是YMMV .