5

使用 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 _)
}

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

object SomeEntity3

弹出一个非常疯狂的多行错误,用于定义*关于“重载方法值 <> 带有替代项”的内容难以辨认的定义。

伴生对象与 Slick 中的双向映射有何关系?我能以某种方式实现我的目标吗?

4

4 回答 4

9

修复非常简单:

def * = id ~ entity1 ~ entity2 <> (SomeEntity3.apply _, SomeEntity3.unapply _)
于 2013-03-02T15:28:14.003 回答
8

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

case class Fnord(a: A, b: B, c: C)(d: D)

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

object Fnord extends ((A, B, C) => Fnord) {
  ...
}

现在,只要您自己明确地拼写出有关伴生对象的内容,编译器就不再生成FunctionN扩展的东西。因此,大多数时候自己添加它是个好主意。在您的情况下,这意味着定义这样的同伴SomeEntity3

object SomeEntity3 extends ((Int, Int, Int) => SomeEntity3) {
  ...
}

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

于 2013-03-03T12:29:24.020 回答
1

另一种方法是将对象 apply 方法转换为元组并将其传递给 <> ,如下所示。

package models

import play.api._
import play.api.libs.json._
import scala.slick.driver.H2Driver.simple._

case class User(
  name: String,
  id: Option[Int] = None
)

object User {
  implicit val format = Json.format[User]
}

class UserTable(tag: Tag) extends Table[User](tag, "USERS") {
  def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
  def name = column[String]("NAME", O.NotNull)

  def * = (name, id.?) <> ((User.apply _).tupled, User.unapply)
}

object Users extends TableQuery(new UserTable(_)) {
  val findByID = this.findBy(_.id)
}
于 2014-05-29T20:58:08.793 回答
0

就个人而言,apply案例类中的部分应用方法不适用于我的设置和 Slick 3.0。

然而,这有效,tupled间接地挖掘到正确的方法:

class WidgetTable(tag: Tag) extends Table[WidgetEntity](tag, "widget_tbl") {

    def id = column[Int]("id",O.PrimaryKey)
    def foo = column[String]("foo")

    override def * = (id,foo) <> ((WidgetEntity.apply _).tupled,WidgetEntity.unapply)
}

查看完整详细信息:https ://stackoverflow.com/a/38589579/564157

于 2016-07-26T12:15:05.440 回答