Hibernate - SQL 查询:如何从特定节点开始获取所有 child descandants
Hibernate - SQL query: How to get all child descandants starting with specific node
我有以下示例数据 (items
),其中包含某种递归。为了简单起见,我将示例限制为 2 个级别。事实上 - 它们可以长得很深。
+----+--------------------------+----------+------------------+-------+
| ID | Item - Name | ParentID | MaterializedPath | Color |
+----+--------------------------+----------+------------------+-------+
| 1 | Parent 1 | null | 1 | green |
| 2 | Parent 2 | null | 2 | green |
| 4 | Parent 2 Child 1 | 2 | 2.4 | orange|
| 6 | Parent 2 Child 1 Child 1 | 4 | 2.4.6 | red |
| 7 | Parent 2 Child 1 Child 2 | 4 | 2.4.7 | orange|
| 3 | Parent 1 Child 1 | 1 | 1.3 | orange|
| 5 | Parent 1 Child 1 Child | 3 | 1.3.5 | red |
+----+--------------------------+----------+------------------+-------+
我需要通过 SQL 全部 children
- 哪些不是
orange
- 对于给定的开始
ID
起始 ID=1
。结果应该是1, 1.3.5
。当以 ID=4
开头时,应该是 2.4.6
.
我读了一点,发现应该使用 CTE。我尝试了以下简化定义
WITH w1( id, parent_item_id) AS
( SELECT
i.id,
i.parent_item_id
FROM
item i
WHERE
id = 4
UNION ALL
SELECT
i.id,
i.parent_item_id
FROM
item, JOIN w1 ON i.parent_item_id = w1.id
);
然而,这甚至不会作为 SQL-statement 执行。我对此有几个问题:
- CTE 可以与 Hibernate 一起使用吗?
- 有没有办法通过 SQL 查询得到结果? (或多或少作为递归模式)
递归模式结合选择 color
作为最终结果,我不知何故迷失了方向。
您的查询无效,原因如下:
- As documented in the manual 递归 CTE 需要
RECURSIVE
关键字
- 你的JOIN syntax是错误的。您需要删除
,
并给 items
table 一个别名。
如果您需要颜色列,只需将其添加到 CTE 中的两个 SELECT 并过滤最终 SELECT.
中的行
如果更改,则以下工作正常:
WITH recursive w1 (id, parent_item_id, color) AS
(
SELECT i.id,
i.parent_item_id,
i.color
FROM item i
WHERE id = 4
UNION ALL
SELECT i.id,
i.parent_item_id,
i.color
FROM item i --<< missing alias
JOIN w1 ON i.parent_item_id = w1.id
)
select *
from w1
where color <> 'orange'
请注意,CTE 定义的列列表是可选的,因此您可以只写 with recursive w1 as ....
我有以下示例数据 (items
),其中包含某种递归。为了简单起见,我将示例限制为 2 个级别。事实上 - 它们可以长得很深。
+----+--------------------------+----------+------------------+-------+
| ID | Item - Name | ParentID | MaterializedPath | Color |
+----+--------------------------+----------+------------------+-------+
| 1 | Parent 1 | null | 1 | green |
| 2 | Parent 2 | null | 2 | green |
| 4 | Parent 2 Child 1 | 2 | 2.4 | orange|
| 6 | Parent 2 Child 1 Child 1 | 4 | 2.4.6 | red |
| 7 | Parent 2 Child 1 Child 2 | 4 | 2.4.7 | orange|
| 3 | Parent 1 Child 1 | 1 | 1.3 | orange|
| 5 | Parent 1 Child 1 Child | 3 | 1.3.5 | red |
+----+--------------------------+----------+------------------+-------+
我需要通过 SQL 全部 children
- 哪些不是
orange
- 对于给定的开始
ID
起始 ID=1
。结果应该是1, 1.3.5
。当以 ID=4
开头时,应该是 2.4.6
.
我读了一点,发现应该使用 CTE。我尝试了以下简化定义
WITH w1( id, parent_item_id) AS
( SELECT
i.id,
i.parent_item_id
FROM
item i
WHERE
id = 4
UNION ALL
SELECT
i.id,
i.parent_item_id
FROM
item, JOIN w1 ON i.parent_item_id = w1.id
);
然而,这甚至不会作为 SQL-statement 执行。我对此有几个问题:
- CTE 可以与 Hibernate 一起使用吗?
- 有没有办法通过 SQL 查询得到结果? (或多或少作为递归模式)
递归模式结合选择 color
作为最终结果,我不知何故迷失了方向。
您的查询无效,原因如下:
- As documented in the manual 递归 CTE 需要
RECURSIVE
关键字 - 你的JOIN syntax是错误的。您需要删除
,
并给items
table 一个别名。
如果您需要颜色列,只需将其添加到 CTE 中的两个 SELECT 并过滤最终 SELECT.
中的行如果更改,则以下工作正常:
WITH recursive w1 (id, parent_item_id, color) AS
(
SELECT i.id,
i.parent_item_id,
i.color
FROM item i
WHERE id = 4
UNION ALL
SELECT i.id,
i.parent_item_id,
i.color
FROM item i --<< missing alias
JOIN w1 ON i.parent_item_id = w1.id
)
select *
from w1
where color <> 'orange'
请注意,CTE 定义的列列表是可选的,因此您可以只写 with recursive w1 as ....