用光滑的文字写一个projection:
定义如何在Person对象之间来回转换列。
默认格式为:
def * = (id, name, age) <> ((Person.apply _).tupled, Person.unapply)
我们可以使用它直接map classes/tuples到数据库表。
您可以在转换过程中使用它来更改值吗?
例如仅作为示例,您可以在Person对象中设置一个常量值,而在数据库中忽略它吗?还是将名称映射为数据库中的String以及Person对象中的枚举?
答案 0 :(得分:3)
下面的代码编译
import slick.jdbc.PostgresProfile.api._
trait Name
object Name {
case class Ordinary(s: String) extends Name
case class Manager(s: String) extends Name
case object NoName extends Name
}
case class Person(id: Long, name: Name, age: Int, isValid: Boolean)
class Persons(tag: Tag) extends Table[Person](tag, "persons") {
def id = column[Long]("id", O.PrimaryKey)
def name = column[String]("name")
def age = column[Int]("age")
def * = (id, name, age) <> ({
case (l, "NoName", i) => Person(l, Name.NoName, i, true)
case (l, s, i) if s.startsWith("Mgr.") => Person(l, Name.Manager(s.stripPrefix("Mgr.")), i, true)
case (l, s, i) => Person(l, Name.Ordinary(s), i, true)
}, (p: Person) => p.name match {
case Name.Ordinary(s) => Some((p.id, s, p.age))
case Name.Manager(s) => Some((p.id, "Mgr." + s, p.age))
case Name.NoName => Some((p.id, "NoName", p.age))
})
}
在这里,我们将isValid
设置为常量,并将name
映射为枚举。