【问题标题】:Prepared Statement with collection in IN clause in Datastax Cassandra CQL driver在 Datastax Cassandra CQL 驱动程序中的 IN 子句中使用集合的预处理语句
【发布时间】:2013-05-30 21:49:18
【问题描述】:

我正在尝试运行以下查询

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 项目,但我需要一个集合

我的语法有错误吗?

【问题讨论】:

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


    【解决方案1】:

    在 Datastax bugzilla 上得到响应,目前不支持,但计划中

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

    更新:Cassandra 2.0.1 支持

    【讨论】:

    • 你能告诉我现在解决了吗?我无法从链接中完全理解。
    【解决方案2】:

    在 Cassandra 2.1.3 中测试,以下代码 sn-p 有效:

    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));
    

    【讨论】:

      【解决方案3】:

      在文档中有点难找,但在 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));
      

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 2016-04-29
        • 2016-04-09
        • 2015-05-13
        • 2018-08-24
        • 2023-03-21
        • 1970-01-01
        • 2017-05-25
        • 2015-02-10
        相关资源
        最近更新 更多