我有嵌套的类/对象,并希望通过使用SLICK将它们存储(并检索)到数据库中。我明白,SLICK映射投影将是关键。此外,我使用伴侣对象来映射嵌套对象和平面结构(存储在数据库表中)。我想要做这样的事情(例如简化):映射投影与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
}
}
但是编译失败与几个错误:“方法不应用被定义了两次”,“暧昧参考超载的定义,无论是方法应用于[...]匹配预期类型?“和“过载方法值<>替代方案”
我发现了映射投影“scala slick method I can not understand so far”和“Mapped projection with <> to a case class with companion object in Slick”的优秀解释,但没有一个建议的解决方案适用于我。
非常感谢。事实上,我更喜欢你的第一个解决方案工作得很好但是,大约有十几个参数,整个映射似乎有很多样板。我了解SLICK的直接嵌入将更加紧凑,但不允许插入。我期待看到SLICK将如何在这方面取得进展。 – jans 2013-03-29 01:54:16
即使你可以用你的问题中描述的“apply”和“unapply”,你仍然必须处理好几十个参数吗? FWIW,看看我最后的编辑。 – Faiz 2013-03-29 05:08:52
对于方法“应用”,使用案例类和上次编辑时,我得到“重载定义的模糊引用”错误。因此,我不得不将同伴对象中的方法重命名为“fromRow”。 – jans 2013-04-02 13:51:18