LoginSignup
11
10

More than 5 years have passed since last update.

Slickで自分で定義したcase classにマップする方法

Last updated at Posted at 2014-09-10

概要

Slickで特定のカラム型を自分で定義したクラスにマッピングする方法です。

解説

カラムとクラスを一対一でマップする

単一のカラムであれば、以下の様にMappedToを使うことで通常のカラム型と一対一で紐づけることができます。

Coffee.scala

case class CoffeeId(value: Int) extends MappedTo[Int]

case class Coffee(coffeeId: CoffeeId, coffeeName: String)

class Coffees(tag: Tag) extends Table[Coffee](tag, "coffees") {

  def coffeeId = column[CoffeeId]("coffee_id", O.PrimaryKey)

  def coffeeName = column[String]("coffee_name")

  def * = (coffeeId, coffeeName) <> (Coffee.tuppled, Coffee.unapply)
}

複数のカラムを一つのクラスにマップする

複数のカラムを一つのクラスにマップする場合は、以下の様に<>を使って*の場合と同様に定義します。

Coffee2.scala

case class CoffeeId(value: Int) extends MappedTo[Int]

case class CoffeeName(japanese: String, english: String)

case class Coffee(coffeeId: CoffeeId, coffeeName: CoffeeName)

class Coffees(tag: Tag) extends Table[Coffee](tag, "coffees") {

  def coffeeId = column[CoffeeId]("coffee_id", O.PrimaryKey)

  def japaneseName = column[String]("japanese_name")

  def englishName = column[String]("english_name")

  def coffeeName = (japaneseName, englishName) <> (CoffeeName.tuppled, CoffeeName.unapply)

  def * = (coffeeId, coffeeName) <> (Coffee.tuppled, Coffee.unapply)
}

自分で変換処理を書きたい場合

自分で変換処理を書きたい場合は、以下の様にMappedColumnTypeを使用することでエンコード、デコードの処理を記述できます。

implicit val dateTimeColumnType = MappedColumnType.base[org.joda.time.DateTime, java.sql.Timestamp](
  { dt => new java.sql.Timestamp(dt.getMillis) },
  { ts => new org.joda.time.DateTime(ts) }
)
11
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10