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

时间:2013-12-12 18:45:13

标签: java hibernate postgresql jpa jpql

我创建了一个用于存储分层数据的表。 在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)如何找到特定父节点的子节点和叶子?

1 个答案:

答案 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
;

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