【发布时间】:2015-10-06 03:20:51
【问题描述】:
在阅读了 datastax 博客中的“Asynchronous queries with the Java driver”文章后,我试图实现一个类似于“案例研究:多分区查询”一节中的解决方案,也就是“客户端 SELECT...在“”。
我目前的代码如下所示:
public Future<List<ResultSet>> executeMultipleAsync(final BoundStatement statement, final Object... partitionKeys) {
List<Future<ResultSet>> futures = Lists.newArrayListWithExpectedSize(partitionKeys.length);
for (Object partitionKey : partitionKeys) {
Statement bs = statement.bind(partitionKey);
futures.add(executeWithRetry(bs));
}
return Futures.successfulAsList(futures);
}
但是,我想对此进行改进。在这个 BoundStatement 持有的 cql 查询中,我想要一些看起来像这样的东西:
SELECT * FROM <column_family_name> WHERE <param1> = :p1_name AND param2 = :p2_name AND <partiotion_key_name> = ?;
我希望此方法的客户端给我一个 BoundStatement,其中包含已绑定的参数(在本例中为两个参数)和分区键列表。在这种情况下,我需要做的就是绑定分区键并执行查询。不幸的是,当我将密钥绑定到此语句时,我失败并出现错误 - com.datastax.driver.core.exceptions.InvalidTypeException: Invalid type for value 0 of CQL type varchar, expecting class java.lang.String but class java.lang.Long provided。问题是,我尝试将密钥绑定到第一个参数而不是最后一个参数。这是一个字符串而不是一个长的。
我可以通过给分区参数一个名称来解决这个问题,但是我必须通过方法参数获取名称,或者通过指定它的索引,这又需要一个额外的方法参数。无论哪种方式,如果我使用名称或索引,我必须将它与特定类型绑定。例如:bs.setLong("<key_name>", partitionKey);。由于某种原因,我不能让 BoundStatement 来解释最后一个参数的类型。
我想避免显式传递参数名称并绕过类型问题。有什么可以做的吗?
谢谢!
【问题讨论】:
标签: cassandra cql datastax datastax-java-driver