我的问题是:
我的Scala案例类有参数,其中集合(即List)是其构造函数参数的一部分,我想知道如何在必要时将我的case类映射到Slick样式数据库表中?
换句话说,我希望"以Slick方式连接表格以映射到Json格式的case类,该类将被表示为前端(javascript)位"?
如果我的问题不够明确,请给我一个大喊。
同样的问题是: https://groups.google.com/forum/#!topic/scalaquery/QqZz_M-1VTg
例如,
case class ClassA (id: Int, lists: List[ClassB])
object ClassA extends TableQuery(new ClassATable(_)) {
// JSON formatter
implicit val classAFormat: Format[ClassA] = (
(JsPath \ "id").formatNullable[Int] and
(JsPath \ "lists").format[List[ClassB]]
)(ClassA.apply, unlift(ClassA.unapply))
}
case class ClassB (id: Int, name: String)
object ClassB extends TableQuery(new ClassBTable(_)) {
implicit val classBFormat: Format[ClassB] = (
(JsPath \ "id").formatNullable[Int] and
(JsPath \ "name").format[String]
)(ClassB.apply, unlift(ClassB.unapply))
}
所以,缺少的一点是创建ClassATable和ClassBTable,以便通过每个人的身份与#34; id"?
建立双向关系非常感谢,
答案 0 :(得分:1)
像这样的一个类
case class ClassA (id: Int, lists: List[ClassB])
表示在加载表A时必须加载表B.这硬编码了加载策略。在惯用的Slick代码中可以避免这种情况。相反,在Slick中,这通常通过元组来解决,以使其更灵活。然后将Slick表简单地映射到ClassA和ClassB的版本,这些版本不包含彼此的引用,只包含列数据。相反,联接可以生成类型为List[(ClassA,ClassB)]
的结果,并且使用groupBy和map可以生成(ClassA,List[ClassB])
。 (或者,您可以通过两个单独的查询获得相同的信息。)这大致是您想要的。您可以定义一个小case class AWithBs(a: ClassA, bs: List[ClassB])
来关联它们,而不是元组。您可以.map(AWithBs.apply)
从元组列表中创建它们。