这一切都发生在带有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")
两种类型都没有检查。
对此有何见解?提前谢谢
答案 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]))