Ho classi/oggetti nidificati e voglio memorizzarli (e recuperarli) in un database usando SLICK. Capisco che con la proiezione mappata SLICK sarebbe la chiave. Inoltre, utilizzo un oggetto companion per mappare tra oggetti nidificati e struttura piatta (da memorizzare nella tabella DB). Voglio fare qualcosa di simile (esempio semplificato):proiezione mappata con oggetto companion in SLICK
case class Foo(id: Int, myBar: Bar)
case class Bar(myInt: Int, myString: String)
object Foo {
def apply(id: Int, myInt: Int, myString: String): Foo = Foo(id, Bar(myInt, myString))
override def unapply(f: Foo) = (f.id, f.myBar.myInt, f.myBar.myString)
}
object TTable extends Table[Foo]("FOO") {
def id = column[Int]("id", O.PrimaryKey)
def myInt = column[Int]("myInt", O NotNull)
def myString = column[String]("myString", O NotNull)
def * = id ~ myInt ~ myString <> (Foo.apply _, Foo.unapply _)
def query(db: Database, id: Int): Option[Foo] = db withSession { //s: Session =>
(for { b <- TTable if b.id is id} yield b).firstOption
}
}
Ma la compilazione fallisce con diversi errori: "Metodo unapply è definito due volte", "riferimento ambiguo per definizione sovraccarico, sia di metodo si applica [...] corrisponde al tipo previsto? " e "Valore metodo di overload <> con alternative"
ho trovato questa spiegazione eccellente di proiezione mappati "scala slick method I can not understand so far" e "Mapped projection with <> to a case class with companion object in Slick", ma nessuna delle soluzioni proposte funziona per me.
Grazie mille. Anzi preferisco la tua prima soluzione che funziona molto bene. Ma con circa una dozzina di parametri, l'intera mappatura sembra essere un grosso problema. Capisco che l'incorporamento diretto di SLICK sarebbe più compatto ma non consente ancora gli inserimenti. Non vedo l'ora di vedere come SLICK progredirà al riguardo. – jans
Anche se tu fossi in grado di applicare 'apply' e' unpply' come descrivi nella tua domanda, dovresti comunque avere a che fare con le tue dozzine di parametri, giusto? FWIW, guarda la mia ultima modifica. – Faiz
Con una classe case e l'ultima modifica ottengo un errore "riferimento ambiguo alla definizione overload" per il metodo 'apply'. Quindi, ho dovuto rinominare il metodo in oggetto companion su 'fromRow'. – jans