递归JPA查询?
JPA 2是否具有运行递归查询" title="递归查询">递归查询的任何机制?
这是我的情况:我有一个实体E,其中包含一个整数字段x。它还可能具有通过@OneToMany映射的E类型的子代。我想做的是通过主键找到一个E,并获取其x的值以及所有后代的x值。有没有办法在单个查询中执行此操作?
我正在使用Hibernate 3.5.3,但我不希望在Hibernate API上没有任何明确的依赖关系。
编辑:根据这一项目,Hibernate并 没有 具备这个功能,或者至少是在三月份没有。因此,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 NodeINSERT 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不会为您这样做。例如,如果将节点移动到其他父对象,则必须更新两个父引用,并从新的父对象确定新的路径值。
另一种方法称为
,这更复杂。最好由其创建者最好地描述(而不是由我逐字逐句地加以描述)。
第三种方法称为嵌套间隔模型,但是这种方法非常依赖于存储过程的实现。
SQL的艺术第7章介绍了对该问题的更完整的解释。
以上是 递归JPA查询? 的全部内容, 来源链接: utcz.com/qa/427436.html