【问题标题】:Does Slick handle a collection like List/Set etc?Slick 是否处理 List/Set 等集合?
【发布时间】:2014-06-10 15:38:46
【问题描述】:

我的问题是:

我的 Scala 的案例类具有参数,其中集合(即 List)是其构造函数参数的一部分,我想知道如果需要,如何将我的案例类映射到 Slick 样式的数据库表中?

换句话说,我想“以 Slick 方式加入表格以映射到 Json 格式的案例类,该类将表示为前端 (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 以通过每个人的“id”存在双向关系?

非常感谢,

【问题讨论】:

标签: scala slick case-class


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

【讨论】:

  • 如果只在加载表 A 的同时加载表 B 怎么办?
  • 原因是我只想打一个端点,这让我只保存一次数据,这反过来又会节省时间/性能?
  • 没有变化:)。 Slick Tables 直接描述您的关系表。应使用连接表的查询来处理关系。它们是您在 Slick 中“映射”关系的方式。将它们存储在某个 var 或 def 中以供重复使用。
  • 嗨,vogt 先生,我想知道您是否可以向我指出与该主题相关的更多资源(如 github?)?谢谢
  • 也许 github.com/slick/slick/blob/master/slick-testkit/src/main/scala/… 应该会在 6 月底左右提供有关该主题的文档章节。
猜你喜欢
  • 1970-01-01
  • 2019-07-15
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多