是否可以在Slick中自动推断结果类型?

时间:2013-11-10 13:20:52

标签: scala playframework playframework-2.0 slick play-slick

让我们说我有这个方法使用Slick的普通SQL运行一个相当基本的查询:

object Data {

    case class User(user: String, password: String)

    implicit val getUserResult = GetResult(r => User(r.<<, r.<<))

    def getUser(user: String, password: String): Option[User] = DB.withSession {
        sql"""
            SELECT  "user", 
                    "password" 
            FROM    "user" 
            WHERE   "user" = $user AND 
                    "password" = $password
        """.as[User].firstOption
    }

}

如果我在同一个表中有超过100列的不同查询,该怎么办:

SELECT * FROM "user"

在这种情况下,关于这两行会有很多打字:

case class User(user: String, password: String, something: Int, ...)
implicit val getUserResult = GetResult(r => User(r.<<, r.<<, r.<<, ...))

是否有可能以某种方式自动化这两行而无需手动映射100列?自动推断类型,或者即使每个列都作为字符串类型返回,也是一个不错的选择。

如果需要详细信息,我的堆栈是Play Framework 2.2.1,Scala 2.10.3,Java 8 64Bit,PostgreSQL 9.3

1 个答案:

答案 0 :(得分:2)

您为GetResult提供的功能会收到PositionedResult作为参数。随心所欲地使用它。

如果你定义

implicit val getListStringResult = scala.slick.jdbc.GetResult[List[String]](
  prs => (1 to prs.numColumns).map(_ => prs.nextString).toList
)

然后你可以说

sql"...".as[List[String]].firstOption