gpt4 book ai didi

java - 递归 JPA 查询?

转载 作者:太空狗 更新时间:2023-10-29 22:50:46 32 4
gpt4 key购买 nike

JPA 2 是否有任何运行递归查询的机制?

这是我的情况:我有一个实体 E,它包含一个整数字段 x。它也可能有 E 类型的 child ,通过@OneToMany 映射。我想做的是通过主键找到一个 E,并获得它的 x 值,以及它所有后代的 x 值。有没有办法在单个查询中执行此操作?

我正在使用 Hibernate 3.5.3,但我不希望对 Hibernate API 有任何显式依赖。


编辑:根据 this item,Hibernate 没有有这个特性,或者至少在 3 月份没有。所以 JPA 似乎不太可能拥有它,但我想确定一下。

最佳答案

使用简单的邻接模型,其中每一行都包含对其父项的引用,父项将引用同一表中的另一行,不能与 JPA 很好地协作。这是因为 JPA 不支持使用 Oracle CONNECT BY 子句或 SQL 标准 WITH 语句生成查询。如果没有这两个子句中的任何一个,就不可能使邻接模型变得有用。

但是,还有一些其他方法可以应用于此问题的建模。第一个是物化路径模型。这是节点的完整路径被展平为一列的地方。表定义扩展如下:

CREATE TABLE node (id INTEGER,
path VARCHAR,
parent_id INTEGER REFERENCES node(id));

插入节点树看起来像这样:

INSERT INTO node VALUES (1, '1', NULL);  -- Root Node
INSERT INTO node VALUES (2, '1.2', 1); -- 1st Child of '1'
INSERT INTO node VALUES (3, '1.3', 1); -- 2nd Child of '1'
INSERT INTO node VALUES (4, '1.3.4', 3); -- Child of '3'

因此,要获取节点“1”及其所有子节点,查询是:

SELECT * FROM node WHERE id = 1 OR path LIKE '1.%';

要将其映射到 JPA,只需将“路径”列设为持久对象的属性即可。但是,您必须进行簿记以保持“路径”字段是最新的。 JPA/Hibernate 不会为你做这个。例如。如果将节点移动到不同的父节点,则必须更新父引用并确定来自新父对象的新路径值。

另一种方法称为嵌套集模型,它有点复杂。可能最好 described由其发起者(而不是我逐字添加)。

还有第三种方法称为嵌套区间模型,但是这在很大程度上依赖于存储过程来实现。

The Art of SQL 的第 7 章中描述了对这个问题的更完整的解释。 .

关于java - 递归 JPA 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3638082/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com