gpt4 book ai didi

java - 在 JPA Hibernate 的分层表中删除/查找节点

转载 作者:行者123 更新时间:2023-12-01 13:43:00 25 4
gpt4 key购买 nike

出于某种目的,我创建了一个表来存储分层数据。在 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)
)

表名称:信息

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”时,它需要在更新时级联。如何在 JPQL 或 JAVA 中的 Hibernate NativeQuery 中执行此操作?

Q2) 如何找到特定父节点的子节点和叶子节点?

最佳答案

您正在寻找的是递归 common table expression (CTE)。

我不知道 JPQL 是否公开了该功能,但是针对您的情况的直接 native 查询将如下所示(它提供了 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
;

请记住,该查询假设您的数据中没有循环 - 请阅读链接以获取有关处理这种情况的提示。

关于java - 在 JPA Hibernate 的分层表中删除/查找节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20551666/

25 4 0
文章推荐: java - 序列化 ArrayList 二进制文件的数据结构