【问题标题】: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])