我有嵌套类/对象,并希望使用SLICK在数据库中存储(和检索)它们。我知道使用SLICK的映射投影将是关键。此外,我使用伴生对象来映射嵌套对象和平面结构(以存储在DB表中)。我想做类似于这样的事情(简化示例):
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
}
}
但编译失败,出现多个错误:"方法unapply定义了两次"、"对重载定义的引用不明确,两个方法apply[...]匹配了期望的类型?"和"具有替代方案的重载方法值<>"。我在这里找到了关于mapped projection(映射投影)的优秀解释 "scala slick method I can not understand so far" 和 "Mapped projection with <> to a case class with companion object in Slick",但是没有一种建议的解决方案适用于我。
apply
和unapply
,您仍然必须处理数十个参数,对吧?顺便说一下,请查看我的最后一次编辑。 - Faiz