Sto provando a mappare una riga DB con più di 22 colonne a un albero della classe del caso. Preferisco non usare HList perché non voglio lavorare con quell'API, e anche per alcuni riscontri temporali di compilazione che ho letto da qualche parte ...Mappatura personalizzata alla struttura della classe caso nidificata in Slick (oltre 22 colonne)
Ho letto questo thread risposto da Stefan Zeiger : How can I handle a > 22 column table with Slick using nested tuples or HLists?
ho visto questo test, che mostra come definire una funzione di mappatura personalizzata e mi piacerebbe farlo:
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)))
})
Il problema è che posso ce la fanno!
Ho provato con piccoli passaggi.
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)
}
Sembra che quando chiamo
(id, (firstName, lastName)).shaped
Il tipo è ShapedValue[(Column[String], (Column[String], Column[String])), Nothing]
Anche se questo sembra funzionare bene
(id, firstName, lastName).shaped
Il parametro di tipo U non è Nothing
ma come previsto (String, String, String)
Non capisco davvero come funzionino tutti gli interni di Slick. Qualcuno può spiegarmi perché non riesco a far funzionare il mio codice? C'è un'importazione mancante o qualcosa del genere?
Credo che ho bisogno di ottenere un valore di tipo
ShapedValue[(Column[String], (Column[String], Column[String])), (String, (String, String))]
ma non so perché mi torna Nothing
e non capisco dove queste implicite Shape
parametri provengono da ...
Quello che voglio è solo essere in grado di dividere facilmente la mia colonna in 2 classi case
Grazie
grazie, sembra che tu abbia ragione funziona bene. È così facile fare errori quando si hanno tuple molto grandi;) Penso di avere un problema con l'inferenza di tipo e forse un refuso quindi ho deciso di andare passo dopo passo, fornendo i tipi esplicitamente ad ogni passaggio e ora funziona –
grazie , questo ha funzionato anche per me. Inoltre ho trovato un ottimo esempio su https: //lihaimei.wordpress.com/2016/03/30/slick-1-fix-più-di-22-colonne-case/ – Muhammad