概要
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) }
)