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

起始 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 执行。我对此有几个问题:

  1. CTE 可以与 Hibernate 一起使用吗?
  2. 有没有办法通过 SQL 查询得到结果? (或多或少作为递归模式)

递归模式结合选择 color 作为最终结果,我不知何故迷失了方向。

您的查询无效,原因如下:

  1. As documented in the manual 递归 CTE 需要 RECURSIVE 关键字
  2. 你的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 ....