在Datastax Cassandra CQL驱动程序的IN子句中使用集合准备语句

时间:2013-06-04 13:14:43

标签: cassandra cql cql3 datastax-enterprise datastax-java-driver

我正在尝试运行以下查询

SELECT edge_id, b_id FROM booking_by_edge WHERE edge_id IN ?

我将Long的Java列表绑定为参数,我得到一个异常

SyntaxError: line 0:-1 mismatched input '<EOF>' expecting ')' (ResultSetFuture.java:242)

如果我尝试使用(?),它希望绑定单个Long项,但我需要一个集合

我的语法是否有错误?

3 个答案:

答案 0 :(得分:17)

在Cassandra 2.1.3中测试过以下代码片段:

PreparedStatement prepared = session.prepare("SELECT edge_id, b_id FROM booking_by_edge WHERE edge_id IN ?;");
List<Long> edgeIds = Arrays.asList(1L, 2L, 3L);
session.execute(prepared.bind(edgeIds));

答案 1 :(得分:7)

对Datastax bugzilla有回应,目前不支持,但计划

https://issues.apache.org/jira/browse/CASSANDRA-4210

更新:Cassandra 2.0.1支持

答案 2 :(得分:0)

在文档中有点难以找到,但tuples section of the manual中对此进行了描述。

如果要使用命名参数,则应使用setList()方法。

BoundStatement bs = session.prepare("select col from table where col in :values").bind();
bs.setList("values", Arrays.asList(v1, v2, v3));