【问题标题】:Remove/Find Nodes in hierarchical table of JPA Hibernate在 JPA Hibernate 的分层表中删除/查找节点
【发布时间】:2013-12-31 08:18:24
【问题描述】:

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

【问题讨论】:

  • 对于第一季度,我认为如果您在父引用中将其设置为级联删除,它也会删除子级。对于 Q2,我不知道该怎么做,但我认为您正在寻找的是“分层查询”。这可能有助于谷歌。我以前在 plan-ol' Hibernate 中做过一次这样的事情,但已经很久了,我再也没有参考资料了。
  • 我如何设置级联删除到这个表,因为它是我唯一的表?你能给个样品吗? @CodeChimp
  • 您不是在表格上设置它,而是在您的实体中设置它,通过使用@CascadeOnDelete 或在您的关系注释中设置cascadeType={CascadeType.DELETE}@OneToMany@ManyToOne等)
  • 为了放置 '@OneToMany' 或 '@ManyToOne' 我必须有另一个实体,问题是我只有一个实体等于一个表(如上所示)
  • 不,您可以拥有一个指向同一个实体/表的@OneToMany。当我必须用节点表示树结构时,我这样做了,所以我知道这是可能的。为了支持它,您所要做的就是能够告诉 JPA 关系是如何连接在一起的,以便它可以进行适当的选择。这就是我假设您在这里所做的,因为您提到了父节点和子节点。源代码示例可能会帮助我更好地理解您在做什么或尝试做什么。

标签: java hibernate postgresql jpa jpql


【解决方案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
;

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

【讨论】:

  • 当我运行您的查询时,它会检索到 0 行
  • 这会返回父级的子级,我只需要显示子级
  • 在主“select * from parents”查询中添加“where NAME != S3”怎么样?
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 2020-05-06
  • 2021-06-28
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
相关资源
最近更新 更多