我正在使用帶有 Cassandra4io 庫的 scala。我正在嘗試執行 select IN 查詢。IN 的引數就像一個元組(逗號分隔的字串值)。它對我不起作用。我嘗試了不同的方法。
// keys (List[String])
val clientIdCommaSepValues = keys.mkString(",")
val selectValue = selectQuery(clientIdCommaSepValues)
private def selectQuery(clientids: String) =
cql"select * from clientinformation WHERE (clientid IN ( ${clientids} ))".as[CassandraClientInfoRow]
這僅在值為 1 時有效(鍵的長度為 1)。
或者
private val selectQuery =
cqlt"select * from clientinformation WHERE (clientid IN ${Put[String]}) ".as[CassandraClientInfoRow]
我還嘗試在字串上加上 ' ' 引號。
uj5u.com熱心網友回復:
對此延遲表示抱歉。事實證明,在您的值周圍添加一組額外的括號(在上面的示例中IN (${clientIds}))會拋出字串插值器,導致它選擇錯誤的 Binder 資料型別,該資料型別用于在將查詢中的資料型別發送到 Cassandra 之前對其進行序列化(哎喲!)。

這選擇了 TEXT 而不是 List[TEXT]
您想要做的是重新制定查詢,如下所示:
val keys: List[String] = ???
val selectValue = selectQuery(keys)
private def selectQuery(clientids: List[String]) =
cql"select * from clientinformation WHERE clientid IN ${clientids}".as[CassandraClientInfoRow]"""
我能夠在我的最后重現這個并洗掉括號。這就是我所做的
CREATE KEYSPACE example WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };
CREATE TABLE IF NOT EXISTS test_data (
id TEXT,
data INT,
PRIMARY KEY ((id))
);
package com.ringcentral.cassandra4io
import cats.effect._
import com.datastax.oss.driver.api.core.CqlSession
import com.ringcentral.cassandra4io.cql._
import fs2._
import java.net.InetSocketAddress
import scala.jdk.CollectionConverters._
object Investigation extends IOApp {
final case class TestDataRow(id: String, data: Int)
def insert(in: TestDataRow, session: CassandraSession[IO]): IO[Boolean] =
cql"INSERT INTO test_data (id, data) VALUES (${in.id}, ${in.data})"
.execute(session)
override def run(args: List[String]): IO[ExitCode] = {
val rSession = {
val builder =
CqlSession
.builder()
.addContactPoints(List(InetSocketAddress.createUnresolved("localhost", 9042)).asJava)
.withLocalDatacenter("dc1")
.withKeyspace("example")
CassandraSession.connect[IO](builder)
}
rSession.use { session =>
val insertData: Stream[IO, INothing] =
Stream.eval(insert(TestDataRow("test", 1), session) *> insert(TestDataRow("test2", 2), session)).drain
def query(ids: List[String]): Stream[IO, TestDataRow] =
cql"SELECT id, data FROM test_data WHERE id IN $ids"
.as[TestDataRow]
.select(session)
(insertData query(List("test", "test2")))
.evalTap(i => IO(println(i)))
.compile
.drain
.as(ExitCode.Success)
}
}
}

這很好用,因為現在它選擇了正確的 Binder,即 List(TEXT),如上所示!很抱歉您遇到的麻煩和神秘的錯誤訊息,但感謝您使用這個庫:D
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/419715.html
標籤:
