使用 Hibernate 递归数据库查询以获取分层结果 - Java

Recursion On Database Query to get hierarchical result using Hibernate - Java

我的 Oracle 数据库中有一个 table 与 child parent 关系,如 -

我需要的是在 Hibernate 中以分层方式访问 child 的列表。

我也有一个 java 实体。

public class relations {
    private String child;
    private String parent;
    public getChild();
    public getParent();
    public setChild();
    public setParent();
}

如何运行对此进行递归?

我应该通过在 SQL 中编写命名查询来获取列表,还是可以在 java hibernate 中实现?

我要找的是在java中写一个递归代码。 提前致谢。

不要在 Java 中进行递归查找。这不会扩展,因为您将向数据库发送 lots 查询。直接在数据库上使用(单个)递归查询,这将更好地执行和扩展。

您没有指定您的 DBMS,但所有现代数据库都支持递归查询。以下是标准的 ANSI SQL:

with recursive ancestry as (
   select child, parent, 1 as level
   from users
   where parent = 'Grandfather' -- this is the one who logs in
   union all
   select c.child, c.parent, p.level + 1
   from users c
     join ancestry p on p.child = c.parent
)
select child, level
from ancestry
order by level desc;

示例:http://rextester.com/TJGTJ95905


编辑真实数据库公开后。

在 Oracle 中,您有两种方法可以做到这一点。

"traditional" 方法是使用 connect by,这是比 SQL 标准提出的更紧凑的递归查询形式:

select child, level
from users
start with parent = 'Grandfather'
connect by prior child = parent
order by level desc;

也可以在 Oracle 中使用常见的 table 表达式。然而,尽管 SQL 标准要求关键字 recursive 是强制性的,但 Oracle 选择忽略该部分标准,因此您必须将其删除。 LEVEL 是 Oracle 中的伪列,只能与 connect by 一起使用,因此不能用于 CTE 解决方案:

with ancestry (child, parent, lvl) as (
   select child, parent, 1 as lvl
   from users
   where parent = 'Grandfather'
   union all
   select c.child, c.parent, p.lvl + 1
   from users c
     join ancestry p on p.child = c.parent
)
select child, lvl
from ancestry
order by lvl desc