【问题标题】:How to use the mapped projection * <>如何使用映射投影 * <>
【发布时间】:2019-08-13 09:49:21
【问题描述】:

在 slick 中你写了一个projection

定义列与 Person 对象之间的转换方式。

默认格式为:

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

我们可以用它直接map classes/tuples 到数据库表。
你能用它来改变值作为转换的一部分吗?

例如纯粹作为一个例子,你可以在 Person 对象中设置一个常量值,但在数据库中忽略它吗?还是将名称映射为数据库中的字符串,以及 Person 对象中的枚举?

【问题讨论】:

    标签: scala slick


    【解决方案1】:

    以下代码编译

    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 映射到枚举。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2013-02-10
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2014-12-19
      • 2017-12-21
      相关资源
      最近更新 更多