scala – 使用Slick进行递归树状表查询
发布时间:2020-12-16 18:28:00 所属栏目:安全 来源:网络整理
导读:我的表数据形成一个树结构,其中一行可以引用同一个表中的父行. 我试图使用Slick实现的是编写一个返回行和所有子行的查询.此外,我想做同样的事情,但写一个将返回一个孩子及其所有祖先的查询. 换一种说法: findDown(1)应该返回 List(Group(1,"1"),Group(3,1,"
|
我的表数据形成一个树结构,其中一行可以引用同一个表中的父行.
我试图使用Slick实现的是编写一个返回行和所有子行的查询.此外,我想做同样的事情,但写一个将返回一个孩子及其所有祖先的查询. 换一种说法: findDown(1)应该返回 List(Group(1,"1"),Group(3,1,"3 (Child of 1)")) findUp(5)应该返回 List(Group(5,2,"5 (Child of 2)"),Group(2,"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,"2"),"3 (Child of 1)"),Group(4,3,"4 (Child of 3)"),Group(5,Group(6,"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链接以递归方式搜索同一个表.任何其他解决问题的好方法都非常受欢迎.但请记住,最好尽量减少数据库往返次数. 解决方法
您可以尝试从光滑调用SQL.上层次结构的SQL调用看起来像这样(这适用于SQL Server):
WITH org_name AS
(
SELECT DISTINCT
parent.id AS parent_id,parentname.label as parent_label,child.id AS child_id,childname.ConceptName as child_label
FROM
Group parent RIGHT OUTER JOIN
Group child ON child.parent_id = parent.id
),jn AS
(
SELECT
parent_id,parent_label,child_id,child_label
FROM
org_name
WHERE
parent_id = 5
UNION ALL
SELECT
C.parent_id,C.parent_label,C.child_id,C.child_label
FROM
jn AS p JOIN
org_name AS C ON C.child_id = p.parent_id
)
SELECT DISTINCT
jn.parent_id,jn.parent_label,jn.child_id,jn.child_label
FROM
jn
ORDER BY
1;
如果您想要进入层次结构,请更改以下行: org_name AS C ON C.child_id = p.parent_id 至 org_name AS C ON C.parent_id = p.child_id (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
