2013-02-28 6 views
9

Slick, wie man eine Abfrage einem Vererbungstabellenmodell zuordnet? dhSlick, wie man eine Abfrage einem Vererbungstabellenmodell zuordnet?

I Tabelle A, B, C A der „Eltern“ Tisch und B & C sind „Kind“ Tabellen Was ich möchte wissen, ist, wie soll ich das glatt so einen Willen mit Modell abstrakt sein und B & C Betontypen, und die Abfrage für eine Zeile in A wird in einem B oder C-Objekt

so etwas wie JPA InheritanceType.TABLE_PER_CLASS ergeben.

+2

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 ... –

+6

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 –

Antwort

9

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 
} 
+0

Schöne Lösung, klare Antwort! Danke fürs teilen. – RoyB

0

Slick unterstützt dies nicht direkt. Einige Datenbanken können Ihnen jedoch bei der Vererbung helfen, daher sollten Sie in der Lage sein, etwas mit dem gewünschten Effekt zu erzielen.

Werfen Sie einen Blick auf die inheritance documentation in PostgreSQL

Verwandte Themen