Projeção mapeada com o objeto complementar em SLICK
Aninhava classes / objetos e queria armazená-los (e recuperá-los) em um banco de dados usando SLICK. Eu entendo que com a projeção mapeada SLICK seria a chave. Além disso, eu uso um objeto complementar para mapear entre objetos aninhados e estrutura plana (para ser armazenado na tabela de banco de dados). Eu quero fazer algo assim (exemplo simplificado):
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
}
}
Mas a compilação falha com vários erros: "método de aplicação é definido duas vezes", "referência ambígua à definição sobrecarregada, o método [...] aplica o tipo esperado de correspondência?" e "valor do método sobrecarregado <> com alternativas"
Eu encontrei esta excelente explicação da projeção mapeada "método scala escorregadio eu não consigo entender até agora"e"Projeção mapeada com <> para uma classe de caso com um objeto complementar no Slick"mas nenhuma das soluções sugeridas funciona para mim.