scala转换的datastax cassandra java驱动程序问题(播放2.3.x)

时间:2015-01-13 22:57:22

标签: scala cassandra scala-collections datastax datastax-java-driver

这一切都发生在带有scala模板的Play 2.3.x应用程序

我正在使用此导入:

import com.datastax.driver.core.Row

与此案例类一起

case class timeOnPage(ip: String, pages: Map[String, Long])

我使用以下代码生成带有cassandra行的timeOnPage实例:

 private def times(row: Row): timeOnPage =
    timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[Long]).toMap)

代码编译正常,但运行时会返回此错误:

[InvalidTypeException: Column page is a map of class java.lang.String->class java.lang.Long (CQL type map<varchar, bigint>), cannot be retrieve as a map of class java.lang.String->long]

我尝试了几种不同的方式来声明classOf [Long],如:

classOf[java.lang.Long]
Class.forName("java.lang.Long")

两种类型都没有检查。

对此有何见解?提前谢谢

1 个答案:

答案 0 :(得分:3)

它不漂亮,但这会强制你的Map [String,java.lang.Long]进入Map [String,Long],允许java驱动程序正确地创建一个它预期的Map键入然后使用asInstanceOf将其强制转换为Map [String,Long]:

private def times(row: Row): timeOnPage =
  timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[java.lang.Long]).toMap.asInstanceOf[Map[String,Long]])

This comment提供了一些更多的指导,例如创建一个隐式转换,用于将Map [String,java.lang.Long]转换为Map [String,Long],例如:

import scala.collection.JavaConverters._

implicit def convMap(in: java.util.Map[String, java.lang.Long]): Map[String, Long] =
  in.asScala.toMap.mapValues(Long2long)

private def times(row: Row): timeOnPage =
  timeOnPage(row.getString("ip"), row.getMap("page", classOf[String], classOf[java.lang.Long]))