【问题标题】:Bind list to Cassandra WHERE clause: getting "Codec not found for requested operation: [list<varchar> <-> scala.collection.immutable.$colon$colon]"将列表绑定到 Cassandra WHERE 子句:获取“未找到请求操作的编解码器:[list<varchar> <-> scala.collection.immutable.$colon$colon]\”
【发布时间】:2022-08-11 17:34:59
【问题描述】:

我试图在 CQL WHERE 子句中的 \"IN\" 关键字之后绑定一个 Scala 列表。

我试过这个

val session: com.datastax.driver.core.Session = ...
val deleteStatement = session.prepare(s\"DELETE FROM table_name WHERE id IN ?;\")

def deleteById(ids: List[String]): Try[Boolean] = {
  val boundStatement = new BoundStatement(deleteStatement)
  boundStatement.bind(ids)
  session.execute(boundStatement).wasApplied()
}

但是 \"boundStatement.bind\" 抛出

未找到请求操作的编解码器:[list <-> scala.collection.immutable.$colon$colon]

如何绑定此列表?

    标签: scala cassandra datastax cql


    【解决方案1】:

    由于 datastax 库是用 Java 编写的,因此 BoundStatement 需要一个 Java 集合。您可以将 Scala 集合显式转换为 Java 集合,如下所示:

    boundStatement.bind(new java.util.ArrayList[String](ids.asJava))
    

    请注意,隐式转换在这里不起作用,因为 bind() 方法接受 java.lang.Object 类型的参数,而不是更具体的参数。

    【讨论】:

      【解决方案2】:

      您还应该能够:

      boundStatement.bind().setList(0, ids.asJava)
      

      或者:

      boundStatement.bind().setList(0, ids.asJava, classOf[String])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-22
        • 2019-05-27
        • 2019-01-03
        • 2018-06-08
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多