如何使用映射的投影* <>

时间:2019-08-13 09:49:21

标签: scala slick

用光滑的文字写一个projection

  

定义如何在Person对象之间来回转换列。

默认格式为:

def * = (id, name, age) <> ((Person.apply _).tupled, Person.unapply)

我们可以使用它直接map classes/tuples到数据库表。
您可以在转换过程中使用它来更改值吗?

例如仅作为示例,您可以在Person对象中设置一个常量值,而在数据库中忽略它吗?还是将名称映射为数据库中的String以及Person对象中的枚举?

1 个答案:

答案 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映射为枚举。