当前位置: 首页 > 知识库问答 >
问题:

在数据斯塔克斯卡桑德拉 CQL 驱动程序的 IN 子句中具有集合的预准备语句

卢景澄
2023-03-14

我正在尝试运行以下查询

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个答案

卞俊哲
2023-03-14

在文档中很难找到,但是在手册的元组部分有描述。

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

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

收到Datastax bugzilla的响应,目前不支持,但计划

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

更新:在Cassandra 2.0.1中受支持

杨骁
2023-03-14

在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.2.4和1.0.0的Datastax java驱动程序(通过Clojure的Alia,但我认为这在这里并不重要)。如果我准备一个带有 timeuuid 列的语句,并将 “now()” 放在 timeuuid 的值中,now() 在编译准备好的语句时被计算一次,然后就再也没有计算过了。 想象一下这个准备好的语句:"插入到some_table(id, time)值(?, now(

  • 我已经用下面的CQL创建了一个表:我想运行查询,按演员姓名(不区分大小写)查找所有视频。 我想从表中选择所有行,而不管演员的名字大小写,例如“汤姆·汉克斯”、“汤姆·汉克斯”、“汤姆·汉克斯”等。 有可能吗?

  • 我相信我已经在Cassandra csharp驱动程序(版本2.7.3)的StatementFactory中发现了一个关于如何缓存准备好的语句的逻辑的bug。下面是使用案例。 我们发现,运行此删除后,只有第一个请求成功。在深入了解StatementFactory的源代码之后 您可以看到缓存仅使用 cql 语句。在我们的例子中,我们在不同的键空间(又名会话)中具有相同的表名。两个查询中的 cql 语

  • 我在Datastax java驱动程序中使用了下面的批处理准备语句代码。 这个Batch语句是已记录还是未记录?

  • 我正在用Cassandra开始一个新项目(并计划使用最新的稳定版(1.2.x))。我尝试过几种不同的Java库,如Hector、Astyanax、Cassandra jdbc。。。 其中,(简而言之)我的选择是阿斯蒂亚纳克斯。但后来我也发现并尝试了数据堆栈的Java驱动程序,它支持新的CQL二进制协议,如果你只使用CQL,它要干净得多。而且1.0.0 GA版本似乎很快就会发布。 你会推荐哪一个?谢

  • 我使用的是datastax Cassandra 2.0驱动程序,我在使用预先准备好的绑定语句。假设我想查询如下内容: 其中,UUID1、UUID2、UUID3是UUID值。使用绑定语句实现这一点的编程方法是什么?目前,我正在尝试以下方法: 这当前返回了错误的结果。如何正确格式化查询有何建议?