使用 Hibernate 递归数据库查询以获取分层结果 - Java
Recursion On Database Query to get hierarchical result using Hibernate - Java
我的 Oracle 数据库中有一个 table 与 child parent 关系,如 -
我需要的是在 Hibernate 中以分层方式访问 child 的列表。
- 当父亲登录时 - 他将儿子设为 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
我的 Oracle 数据库中有一个 table 与 child parent 关系,如 -
我需要的是在 Hibernate 中以分层方式访问 child 的列表。
- 当父亲登录时 - 他将儿子设为 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