7

私は Scala と Slick の両方に非常に慣れていません。それを学ぼうとして、単純なデータベースで動作する小さなアプリケーションを作成しています。

ComplexType私の以前の経験のほとんどは .Net と Entity Framework から来ているので、Slick が私に同じことをさせてくれるかどうか、属性を持つ Entity Framework のように思っていました。

基本的に、私のテーブルの 1 つは 1 対 1 の関係であり、オブジェクトを作成して複合型として使用することを好むテーブルもあります。明らかにデータベースでは、これはテーブルの余分な列にすぎませんが、Slick がそれらの列を私のTableクラスのオブジェクトにマップできるかどうか疑問に思っていました。以下の例を参照してください。

ブログエントリの例を使用します。

Table を拡張する私のメイン クラスBlogEntryは、エントリのテキストを含んでいます。EntryDetails次に、そのクラスで、エントリが投稿された時刻と最後に更新された時刻を含む別のクラスが呼び出されるとします。

データベースでは、これらのフィールドはすべて同じテーブルにありますが、読み込まれると、他のオブジェクトを含む 1 つのオブジェクトになります。これはSlickで可能ですか?

4

1 に答える 1

6

これで問題は解決すると思います

 trait Mapping {
  //Need to change JdbcDriver to the driver that you will use in your code (MySql, Postgres, etc)

  import scala.slick.driver.JdbcDriver.profile.simple._

  // Models
  case class EntryDetails(createDate: Option[DateTime] = None, updateDate: Option[DateTime] = None)

  case class Entry(id: Int, text: String, details: EntryDetails)

  //Implicit Joda Mappers for datetime columns
  implicit def timestamp2dateTime = MappedColumnType.base[DateTime, Timestamp](
    dateTime => new Timestamp(dateTime.getMillis),
    date => new DateTime(date))

  //Table mapping
  class Entries(tag: Tag) extends Table[Entry](tag, "entry") {
    def entryDetails = (createDate, updateDate) <>(EntryDetails.tupled, EntryDetails.unapply)

    def * = (id, text, entryDetails) <>(Entry.tupled, Entry.unapply)

    val id: Column[Int] = column[Int]("id")
    val text: Column[String] = column[String]("text")
    val createDate: Column[Option[DateTime]] = column[Option[DateTime]]("createDate")
    val updateDate: Column[Option[DateTime]] = column[Option[DateTime]]("updateDate")
  }

  //Table query, used in slick 2.0 for querying a table
  lazy val EntryTableQuery = TableQuery[Entries]
}

回答のコードをパックするために、すべてを特性マッピングに含めました。私が理解している限りでは、テーブルを 2 つのオブジェクトにマップし、一方を他方の内部にマップしたいと考えています。これは、テーブル クエリを EntryDetails モデル オブジェクトにマップする、ここでは entryDetails と呼ばれる別のマッピング メソッドを作成することで実現できます。次に、このマッピング メソッドをオブジェクト マッピングの * メソッドに追加できます。メソッド entryDetails は、そのマッピング メソッドの単なる別のパラメーターになります。

于 2014-03-21T12:35:26.680 に答える