使用<>映射投影到Slick中具有伴随对象的案例类

not*_*xit 5 scala slick

使用Slick,我试图将数据库表条目直接投影到它们所代表的案例类.按照文档中示例,我使用<>运算符设置了映射投影:

case class SomeEntity3(id: Int, entity1: Int, entity2: Int)

val SomeEntityTable = new Table[SomeEntity3]("some_entity_table") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def entity1 = column[Int]("entity1")
  def entity2 = column[Int]("entity2")

  def * = id ~ entity1 ~ entity2 <> (SomeEntity3, SomeEntity3.unapply _)
}
Run Code Online (Sandbox Code Playgroud)

现在,我想为SomeEntity3添加一些静态常量和辅助方法.为此,我创建了一个伴侣对象.但是只要我加入这条线

object SomeEntity3
Run Code Online (Sandbox Code Playgroud)

一个非常疯狂的多行错误弹出,用于定义*说"使用替代方法重载方法值<>"时难以辨认的内容.

伴侣对象如何与Slick中的双向映射相关,我能以某种方式实现我的目标吗?

ped*_*rla 9

修复很简单:

def * = id ~ entity1 ~ entity2 <> (SomeEntity3.apply _, SomeEntity3.unapply _)
Run Code Online (Sandbox Code Playgroud)


小智 8

案例类的伴随对象通常是从案例类的第一个参数列表到案例类的函数.所以,如果你有

case class Fnord(a: A, b: B, c: C)(d: D)
Run Code Online (Sandbox Code Playgroud)

Scala编译器会自动生成类似于的伴随对象

object Fnord extends ((A, B, C) => Fnord) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在,只要您自己明确说明了伴随对象的某些内容,编译器就不再生成FunctionN扩展内容.因此,大多数情况下自己添加它是个好主意.在你的情况下,这将意味着定义SomeEntity3像这样的伴侣:

object SomeEntity3 extends ((Int, Int, Int) => SomeEntity3) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

对于这种行为也有一个(长期存在的)问题:https: //issues.scala-lang.org/browse/SI-3664