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

标签 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)
)

表名称:信息

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/

相关文章:

sql - 如何在postgres中获取空白之前的所有字符串?

java - 如何将 BufferedImage 转换为 8 位?

java - 生成长度为 10 的唯一、随机字母数字主键

java - hibernate hsql 获取错误节点 : org. 没有数据类型 hibernate.hql.ast.tree.IdentNode

java - Spring MVC - 没有DAO服务层,如何获取当前 session 以进行条件查询

postgresql - 意外的舍入行为

java - 如何获取JLabel[ ] [ ]中鼠标点击的标签索引?

java - Spring JMS - 指数消息重新传递策略被忽略

java - 将传递依赖行为与 xml-apis 混淆

postgresql - postgresql 中的交叉表函数导致无效的内存分配请求大小