【问题标题】:Is it possible to auto infer result types in Slick?是否可以在 Slick 中自动推断结果类型?
【发布时间】:2013-11-10 13:20:52
【问题描述】:

假设我有一个使用 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

【问题讨论】:

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


    【解决方案1】:

    你给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
    

    【讨论】:

    • 谢谢,它正在工作,但是否可以将结果作为column name -&gt; value 对的映射而不是简单的列表?
    • 我的意思是 Map[String, String] 而不是 List[String]
    猜你喜欢
    • 1970-01-01
    • 2011-09-24
    • 2012-06-02
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多