Wir müssen einige Dinge tun. Suchen Sie zuerst nach einer Möglichkeit, die Hierarchie einer Tabelle zuzuordnen. In diesem Fall verwende ich eine Spalte, die den Typ speichert. Aber Sie können auch andere Tricks anwenden.
trait Base {
val a: Int
val b: String
}
case class ChildOne(val a: Int, val b: String, val c: String) extends Base
case class ChildTwo(val a: Int, val b: String, val d: Int) extends Base
class MyTable extends Table[Base]("SOME_TABLE") {
def a = column[Int]("a")
def b = column[String]("b")
def c = column[String]("c", O.Nullable)
def d = column[Int]("d", O.Nullable)
def e = column[String]("model_type")
//mapping based on model type column
def * = a ~ b ~ c.? ~ d.? ~ e <> ({ t => t match {
case (a, b, Some(c), _, "ChildOne") => ChildOne(a, b, c)
case (a, b, _, Some(d), "ChildTwo") => ChildTwo(a, b, d)
}}, {
case ChildOne(a, b, c) => Some((a, b, Some(c), None, "ChildOne"))
case ChildTwo(a, b, d) => Some((a, b, None, Some(d), "ChildTwo"))
})
}
}
nun spezifische Untertyp bestimmen Sie folgendes tun:
ist
Query(new MyTable).foreach {
case ChildOne(a, b, c) => //childone
case ChildTwo(a, b, d) => childtwo
}
Slick _not_ ein ORM! Wenn Sie ein Schema haben, das um ein ORM-Modell mit Vererbung entworfen wurde, werden Sie wahrscheinlich das ganze Problem der Impedanzmis-Übereinstimmung in umgekehrter Richtung bekommen, wenn Sie versuchen, es in Slick ... –
zu benutzen. Ich weiß, dass es kein ORM ist , aber für ein Framework, das Ihnen eine Form der Zeile <-> Objekt Mapping gibt, frage ich mich, ob solche Fälle der Vererbung in Betracht gezogen wurden –