Slick是否处理List / Set等集合?

时间:2014-06-10 15:38:46

标签: scala slick case-class

我的问题是:

我的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"?

建立双向关系

非常感谢,

1 个答案:

答案 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)从元组列表中创建它们。