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:

https: //github.com/slick/slick/blob/2.1/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/JdbcMapperTest.scala#L129-14

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage