映射突起与<>到的情况下类与油滑伴侣对象(Mapped projection with

2019-08-17 06:58发布

用油滑,我想直接项目数据库表中的条目,以其所代表的情况下类。 继的文档中例如 ,我建立使用映射的投影<>运算符:

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

一个漂亮的野生多行错误的定义弹出*说一些难以辨认的关于“重载方法值<>替代品”。

如何同伴对象涉及到油滑的双向映射和可不知何故,我完成我的目标是什么?

Answer 1:

case类伴侣对象通常是从外壳类的第一个参数列表的情况下的类的功能。 所以,如果你有

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



Answer 2:

解决方法是相当简单:

def * = id ~ entity1 ~ entity2 <> (SomeEntity3.apply _, SomeEntity3.unapply _)


Answer 3:

另一种方式来做到这一点是把对象应用方法成一个元组并传递到<>如下所示。

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)
}


Answer 4:

就个人而言,在部分应用apply从案例类方法不能与我的设置和油滑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



文章来源: Mapped projection with <> to a case class with companion object in Slick
标签: scala slick