scala-cass泛型从cassandra表中读取为case类

时间:2017-06-26 15:06:25

标签: scala cassandra type-constraints scala-generics

我正在尝试使用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]
  }
}

我使用所需的case类实现此类,并尝试在创建的Object上调用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阅读以找到适当的约束,但到目前为止我没有运气。

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

2 个答案:

答案 0 :(得分:2)

看起来as[T]需要您在范围内没有的隐式值,因此您还需要在getRows方法中要求隐含参数。

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

您可以使用context bounds将此表达为类型约束(您在原始问题中寻找的内容):

abstract class GenericReader[T:CCCassFormatDecoder]

答案 1 :(得分:0)

不是尝试绑定您的通用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]

时,可以将该隐含的具体值推迟到