【问题标题】:Scala/Slick plain SQL: retrieve result as a mapScala/Slick 纯 SQL:以地图形式检索结果
【发布时间】:2013-11-10 16:06:45
【问题描述】:

我有一个使用 Sclick 普通 SQL 方法从数据库中检索用户的简单方法:

object Data {

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

    def getUser(id: Int): Option[List[String]] = DB.withSession {
        sql"""SELECT * FROM "user" WHERE "id" = $id""".as[List[String]].firstOption
    }

}

结果是List[String],但我希望它类似于Map[String, String] - 列名和值对映射。这可能吗?如果有,怎么做?

我的堆栈是 Play Framework 2.2.1、Slick 1.0.1、Scala 2.10.3、Java 8 64bit

【问题讨论】:

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


【解决方案1】:
import scala.slick.jdbc.meta._
val columns = MTable.getTables(None, None, None, None)
                    .list.filter(_.name.name == "USER") // <- upper case table name
                    .head.getColumns.list.map(_.column)
val user = sql"""SELECT * FROM "user" WHERE "id" = $id""".as[List[String]].firstOption
                                                         .map( columns zip _ toMap )

【讨论】:

【解决方案2】:

可以在不查询表元数据的情况下执行此操作,如下所示:

   implicit val resultAsStringMap = GetResult[Map[String,String]] ( prs => 
      (1 to prs.numColumns).map(_ => 
         prs.rs.getMetaData.getColumnName(prs.currentPos+1) -> prs.nextString
      ).toMap
   )

也可以用同样的方式构建一个 Map[String,Any],但这显然更复杂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2018-03-02
    • 2013-12-01
    • 2020-02-27
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多