3

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 です。

4

2 に答える 2

8

次のように、テーブルのメタデータをクエリせずにこれを行うことができます。

   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] を構築することも可能ですが、それは明らかにより複雑です。

于 2013-12-03T19:19:45.023 に答える
8
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 )
于 2013-11-10T16:50:32.380 に答える