Scala-Cass 通用读取从 Cassandra 表中作为案例类



我正在尝试使用 scala-cass 从 cassandra 读取并使用resultSet.as[CaseClass]将结果集转换为案例类。这在运行以下内容时效果很好。

import com.weather.scalacass.syntax._    
case class TestTable(id: String, data1: Int, data2: Long)
val resultSet = session.execute(s"select * from test.testTable limit 10")
resultSet.one.as[TestTable]

现在我正在尝试使其更通用,但我无法为泛型类找到正确的类型约束。

import com.weather.scalacass.syntax._    
case class TestTable(id: String, data1: Int, data2: Long)
abstract class GenericReader[T] {
val table: String
val keyspace: String
def getRows(session: Session): T = {
val resultSet = session.execute(s"select * from $keyspace.$table limit 10")
resultSet.one.as[T]
}
}

我使用所需的案例类实现此类,并尝试在创建的对象上调用 getRows。

object TestTable extends GenericReader[TestTable] {
val keyspace = "test"
val table = "TestTable"
}
TestTable.getRows(session)

这将引发异常could not find implicit value for parameter ccd: com.weather.scalacass.CCCassFormatDecoder[T]

我正在尝试向 GenericReader 添加一个类型约束,以确保隐式转换有效。但是,我找不到正确的类型。我正在尝试通读 scala-cass 以找到适当的约束,但到目前为止我没有运气。

我也很乐意使用任何其他可以实现此目的的库。

看起来as[T]需要一个你在作用域中没有的隐式值,所以你还需要在getRows方法中要求该隐式参数。

def getRows(session: Session)(implicit cfd: CCCassFormatDecoder[T]): T

您可以使用上下文边界将其表示为类型约束(您在原始问题中查找的内容):

abstract class GenericReader[T:CCCassFormatDecoder]

与其尝试绑定泛型T类型,不如只传递缺少的隐式参数:

abstract class GenericReader[T](implicit ccd: CCCassFormatDecoder[T]) {
val table: String
val keyspace: String
def getRows(session: Session): T = {
val resultSet = session.execute(s"select * from $keyspace.$table limit 10")
resultSet.one.as[T]
}
}

然后,当您将该T缩小到特定类(如object TestTable extends GenericReader[TestTable])时,可以推迟到为该隐式查找具体值

相关内容

  • 没有找到相关文章

最新更新