gpt4 book ai didi

scala - 使用 Slick 进行递归树状表查询

转载 作者:行者123 更新时间:2023-12-04 16:11:17 24 4
gpt4 key购买 nike

我的表数据形成一个树结构,其中一行可以引用同一个表中的父行。

我试图使用 Slick 实现的是编写一个查询,该查询将返回一行及其所有子项。另外,我想做同样的事情,但编写一个查询,该查询将返回一个 child 及其所有祖先。

换句话说:
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 链接递归搜索同一个表的方法。任何其他解决问题的好方法都非常受欢迎。但请记住,最好尽量减少数据库往返次数。

最佳答案

您可以尝试从 slick 调用 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

关于scala - 使用 Slick 进行递归树状表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15070620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com