查询的RESULTSET隐式转换

时间:2013-10-08 09:19:08

标签: scala resultset implicit-conversion slick

我正在使用Scala 2.10并且遇到Slick问题(普通查询,java.sql.ResultSet)。如果我写像

这样的查询

Q.query[String, ResultSet](query).list(rs.getString("id"))

eclipse会告诉我could not find implicit value for parameter rconv: scala.slick.jdbc.GetResult[java.sql.ResultSet]

我这个问题最重要的来源(http://slick.typesafe.com/doc/0.11.2/sql.html)没有帮助。如何编写这些隐式转换?还有其他任何一种在Slick中代表ResultSet的方式吗?

1 个答案:

答案 0 :(得分:5)

让我试着说清楚:)。如果你有ResultSet,你应该有一个实际映射结果集的类型。例如。一个元组或一个用于保存行的案例类。如果是自定义(案例)课程,则必须提供implicit GetResult,其中介绍了如何从jdbc ResultSet映射到您的班级。 .list的参数应该是您希望Slick放入预准备语句的占位符中的值,而不是您获得ResultSet的值(假设这是rs代表)。

建议的用法是这样的:

import scala.slick.jdbc.{GetResult, StaticQuery}
import StaticQuery.interpolation

val price = 1000.0

// use tuples
val expensiveDevices: List[Device] =
  Q.query[String, (Long,Double,Date)]("select * from DEVICE where PRICE > ?").list( price )

// or a case class (needs implicit GetResult for Device)
case class Device(id: Long,price: Double,acquisition: Date)
implicit val getDeviceResult =
  GetResult(r => Device(r.<<, r.<<, r.<<))
val expensiveDevices2: List[Device] =
  Q.query[String, Device]("select * from DEVICE where PRICE > ?").list( price )

// or the even nicer interpolation syntax
val expensiveDevices3: List[Device] =
  sql"select * from DEVICE where PRICE > $price"    .as[Device].list