我创建了一个用于存储分层数据的表。 在LEAF专栏中它决定它是否是一片叶子。 PARENT_ID列用于检查哪一个是节点的父节点。下面是数据库表。
CREATE TABLE info
(
id bigint NOT NULL,
leaf bigint,
"name" character varying(255),
parent_id bigint,
"value" character varying(255),
"info" character varying(255),
CONSTRAINT info_pkey PRIMARY KEY (id)
)
表名:info
ID LEAF NAME PARENT_ID VALUE INFO
-- ---- ---- ------ ----- ----
1 0 ROOT 0 '' ''
2 0 S2 1 '' ''
3 0 S3 1 TEST1 INFO1
4 1 S4 1 TEST2 ''
5 1 S5 2 '' ''
6 0 S6 3 '' ''
8 1 S8 6 P8 ''
我在我的项目中使用JPA Hibernate和PostgreSQL,这是唯一一个包含数据的表。它与任何其他表无关。
Q1)如果我想删除“S3”我应该怎么做,因为它有“S6”作为孩子,“S8”是“S6”的孩子。所以当我删除“S3”时需要在更新时级联。如何在JAVA中的JPQL或Hibernate NativeQuery中执行此操作?
Q2)如何找到特定父节点的子节点和叶子?
答案 0 :(得分:1)
您正在寻找的是递归common table expression(CTE)。
我不知道JPQL是否公开了这个功能,但是你的情况的直接原生查询看起来像这样(它给出了S3的所有后代):
with recursive parents
as
(
select "ID", "NAME", "PARENT_ID"
from test
where "NAME" = 'S3'
union all
select b."ID", b."NAME", b."PARENT_ID"
from parents a
join test b
on a."ID" = b."PARENT_ID"
)
select *
from parents
;
请记住,该查询假设您的数据中没有循环 - 请通过链接阅读有关处理该情况的提示。