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、caseクラスから部分的に適用されたメソッドは、私のセットアップとSlick3.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 に答える