【问题标题】:Map table with more than 22 columns to Scala case class by Slick 2.1.0Slick 2.1.0 将超过 22 列的表映射到 Scala 案例类
【发布时间】:2014-09-03 15:49:38
【问题描述】:

我正在使用 Scala 2.11、Slick 2.1.0-M2、PlayFramework 2.3.1。

我需要将 25 列的表映射到 Scala 的案例类。

例如我有这个案例类:

case class Test(f1: Long, f2: String, f3: String, f4: String, f5: String, 
                f6: String, f7: String, f8: String, f9: String, f10: String, 
                f11: String, f12: String, f13: String, f14: String, f15: String, 
                f16: String, f17: String, f18: String, f19: String, f20: String, 
                f21: String, f22: String, f23: Float, f24: Float, f25: String)

我读到可以编写自定义 Shape (proof),但我实现它的任何尝试都失败了。

请帮我把这个案例类映射到表格。

【问题讨论】:

  • 这不是重复,因为那里没有关于Shape 的内容。
  • 不是重复,因为这个问题要求案例类 > 22 列,这是 Scala 2.11 中的一个新特性。
  • 这里有任何更新,可能在 Slick 3.0 中?

标签: scala playframework slick playframework-2.3 scala-2.11


【解决方案1】:

对于当前的 slick 版本,这个问题没有很好的解决方案。您可以将一些字段打包到一个案例类中。

请参考这个测试用例。

https://github.com/slick/slick/blob/2.1.0-RC1/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/JdbcMapperTest.scala#L99

【讨论】:

  • 我看到了这个解决方案,我认为维护起来非常糟糕。我认为实现Shape trait 要好得多。但我不能让它健壮。
【解决方案2】:

其实这可以像这样通过HList 完成

def * = (col1 :: col2 :: .. :: HNil).shaped <> (
{ case x => new YYY(x(0), x(1), ..)}, 
{ x: YYY => Option(x.col1 :: x.col2 :: .. :: HNil)}
)

我写了一个宏来做映射,你可以看看这个 https://github.com/jilen/slickext

【讨论】:

    【解决方案3】:

    我有一个 HListCaseClassShape that works 与 CaseClassShape 完全相同,但没有 22 列限制:here。然后,您可以像这样将它映射到您的表:def * = MyHListCaseClassShape(f1, f2, f3...)(参见 Pair * 示例 here)。不确定它是否适用于 Slick 2,但可能值得一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多