Benutzerdefinierte Zuordnung zu verschachtelter Fallklassenstruktur in Slick (mehr als 22 Spalten)
Ich versuche, einer Fallklassenstruktur eine DB-Zeile mit mehr als 22 Spalten zuzuordnen. Ich würde lieber nicht HList verwenden, da ich nicht mit dieser API arbeiten möchte, und auch für einige exponentielle Rückmeldungen zur Kompilierungszeit, die ich irgendwo gelesen habe ...
Ich habe diesen Thread gelesen, der von Stefan Zeiger beantwortet wurde:Wie kann ich mit Slick eine> 22-Spalten-Tabelle mit verschachtelten Tupeln oder HListen behandeln?
Ich habe diesen Test gesehen, der zeigt, wie eine benutzerdefinierte Zuordnungsfunktion definiert wird, und ich möchte dies tun:
def * = (
id,
(p1i1, p1i2, p1i3, p1i4, p1i5, p1i6),
(p2i1, p2i2, p2i3, p2i4, p2i5, p2i6),
(p3i1, p3i2, p3i3, p3i4, p3i5, p3i6),
(p4i1, p4i2, p4i3, p4i4, p4i5, p4i6)
).shaped <> ({ case (id, p1, p2, p3, p4) =>
// We could do this without .shaped but then we'd have to write a type annotation for the parameters
Whole(id, Part.tupled.apply(p1), Part.tupled.apply(p2), Part.tupled.apply(p3), Part.tupled.apply(p4))
}, { w: Whole =>
def f(p: Part) = Part.unapply(p).get
Some((w.id, f(w.p1), f(w.p2), f(w.p3), f(w.p4)))
})
Das Problem ist, dass ich es nicht schaffen kann!
Ich habe es in kleineren Schritten versucht.
class UserTable(tag: Tag) extends TableWithId[User](tag,"USER") {
override def id = column[String]("id", O.PrimaryKey)
def role = column[UserRole.Value]("role", O.NotNull)
def login = column[String]("login", O.NotNull)
def password = column[String]("password", O.NotNull)
def firstName = column[String]("first_name", O.NotNull)
def lastName = column[String]("last_name", O.NotNull)
//
def * = (id, role, login, password, firstName, lastName) <> (User.tupled,User.unapply)
//
def login_index = index("idx_user_login", login, unique = true)
}
Es scheint, dass, wenn ich rufe
(id, (firstName, lastName)).shaped
Der Typ istShapedValue[(Column[String], (Column[String], Column[String])), Nothing]
Während dieser scheint gut zu funktionieren
(id, firstName, lastName).shaped
Der Parameter vom Typ U ist nichtNothing
aber wie erwartet(String, String, String)
Ich verstehe nicht wirklich, wie alle Slick-Interna funktionieren. Kann mir jemand erklären, warum ich meinen Code nicht zum Laufen bringen kann? Fehlt ein Import oder so?
Ich denke, ich muss einen Wert vom Typ @ bekomm
ShapedValue[(Column[String], (Column[String], Column[String])), (String, (String, String))]
aber ich weiß nicht warum es mich zurückgibtNothing
und verstehe nicht wirklich, wo diese implizitenShape
Parameter kommen von ...
Was ich will, ist einfach in der Lage zu sein, meine Spalte in 2 Fallklassen aufzuteilen
Vielen Dan