用油滑,我想直接项目数据库表中的条目,以其所代表的情况下类。 继的文档中例如 ,我建立使用映射的投影<>
运算符:
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
一个漂亮的野生多行错误的定义弹出*
说一些难以辨认的关于“重载方法值<>替代品”。
如何同伴对象涉及到油滑的双向映射和可不知何故,我完成我的目标是什么?
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
解决方法是相当简单:
def * = id ~ entity1 ~ entity2 <> (SomeEntity3.apply _, SomeEntity3.unapply _)
另一种方式来做到这一点是把对象应用方法成一个元组并传递到<>如下所示。
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)
}
就个人而言,在部分应用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