私は、私のジョインをマッピングするためにクエリ側で型を定義しようとしています。これは、私のプロジェクションケースクラスのポストクエリに手動で適用する必要がある値のタプルを返さないようにするためです。私のようなケースクラスに投影するSlickの型付き投影
case class Parent(id: Int, name: String, extra: String)
class ParentTable(tag: Tag) extends Table[Parent](tag, "parent") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def extra = column[String]("extra")
def * = (id, name, extra) <> (Parent.tupled, Parent.unapply)
}
val parents = TableQuery[ParentTable]
case class Child(id: Int, parentId: Int, name: String, extra: String)
class ChildTable(tag: Tag) extends Table[Child](tag, "child") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def parentId = column[Int]("parent_id")
def parent = foreignKey("parent_fk", parentId, parents)(_.id)
def name = column[String]("name")
def extra = column[String]("extra")
def * = (id, parentId, name, extra) <> (Child.tupled, Child.unapply)
}
val children = TableQuery[ChildTable]
:
case class ChildWithParentName(id: Int, name: String, parentName: String)
参加し、投影は次のようになります。私はこれを入れて
val q = for {
c <- children
p <- parents if c.parentId === p.id
} yield (c.id,c.name,p.name)
のような関係を考えると
関数内で、children
とparents
をパラメータ化することができます。時々私は.result
をしたいので、この関数は、クエリを実行しないと、私の関数のシグネチャがあるので、時々私は、.result.headOption
をしたい:
Query[(Rep[Int], Rep[String], Rep[String]), (Int, String, String), Seq]
私のような形状の何かをクエリ側のタイプを作成したいと思います:
class ChildParentProjection(val id: Rep[Int],
val name: Rep[String],
val parentName[String])
私は次のように関数のシグネチャを取得することができるように:
Query[ChildParentProjection, ChildWithParentName, Seq]
はツルツルにその可能ですか?
ありがとうございます。私は '<>'がクエリレベルで適用できることに気づいていませんでした。結果として得られる 'MappedProjection'は、私が達成したいと思っていたもの、つまり' ChildParentProjection'を必要としないと思っていたものよりもはるかに単純なものでした。しかしもう1つの質問: 'q'が' sortBy'で簡単に使えるようになる前に、タプルか 'MappedProjection'から' ChildWithParentName'のどちらかを抽出できないようです –