私のテーブル データは、1 つの行が同じテーブルの親行を参照できるツリー構造を形成します。
私が Slick を使用して達成しようとしているのは、行とそのすべての子を返すクエリを作成することです。また、同じことをしたいのですが、子とそのすべての先祖を返すクエリを書きます。
言い換えると:
findDown(1)
戻るべき
List(Group(1, 0, "1"), Group(3, 1, "3 (Child of 1)"))
findUp(5)
戻るべき
List(Group(5, 2, "5 (Child of 2)"), Group(2, 0, "2"))
これは完全に機能するワークシートです (不足しているソリューションを除く ;-)。
package com.exp.worksheets
import scala.slick.driver.H2Driver.simple._
object ParentChildTreeLookup {
implicit val session = Database.forURL("jdbc:h2:mem:test1;", driver = "org.h2.Driver").createSession()
session.withTransaction {
Groups.ddl.create
}
Groups.insertAll(
Group(1, 0, "1"),
Group(2, 0, "2"),
Group(3, 1, "3 (Child of 1)"),
Group(4, 3, "4 (Child of 3)"),
Group(5, 2, "5 (Child of 2)"),
Group(6, 2, "6 (Child of 2)"))
case class Group(
id: Long = -1,
id_parent: Long = -1,
label: String = "")
object Groups extends Table[Group]("GROUPS") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def id_parent = column[Long]("ID_PARENT")
def label = column[String]("LABEL")
def * = id ~ id_parent ~ label <> (Group, Group.unapply _)
def autoInc = id_parent ~ label returning id into {
case ((_, _), id) => id
}
def findDown(groupId: Long)(implicit session: Session) = { ??? }
def findUp(groupId: Long)(implicit session: Session) = { ??? }
}
}
本当に悪い、静的な試みはfindDown
次のようなものかもしれません:
private def groupsById = for {
group_id <- Parameters[Long]
g <- Groups; if g.id === group_id
} yield g
private def childrenByParentId = for {
parent_id <- Parameters[Long]
g <- Groups; if g.id_parent === parent_id
} yield g
def findDown(groupId: Long)(implicit session: Session) = { groupsById(groupId).list union childrenByParentId(groupId).list }
しかし、Slick が id と id_parent リンクを使用して同じテーブルを再帰的に検索する方法を探しています。問題を解決する他の良い方法は大歓迎です。ただし、データベースの往復回数を最小限に抑えることが最善であることを覚えておいてください。