2010-08-19 113 views
7

我期望的查询是获取属于类别的课程对象的列表。我的目标如下:休眠递归查询

public class Course{ 
    String name; 
    List<Category> categories; 
} 

public class Category{ 
    String name; 
    Category parent; 
} 

由于类相互引用,也可以有无限的深度:

A 
    A.A 
    A.A.A 
    A.A.B 
    A.B 
    A.B.A 
B 
B.A 
B.B 
C 

我如何可以查询类别“AA”范围内的课程,并将所有与AA,AAA和AAB有关的课程?

回答

3

因为你不知道有多深,树,你可以使用某种模式的如下

select distinct 
    c 
from 
    Course c 
left join fetch 
    c.categories c 
where 
    c.name like 'A.A%' 
4

如果你愿意使用本机SQL和数据库支持递归公用表表达式(除了MySQL的基本上所有主要的DBMS),它很容易:

 
WITH RECURSIVE course_tree (name) AS (
    SELECT name 
    FROM course 
    WHERE name = 'A.A' 
    UNION ALL 
    SELECT name 
    FROM course 
    WHERE parent_id = course_tree.id 
) 
SELECT * 
FROM course_tree 
+0

万一某人的兴趣[公用表表达式是SQL的一部分:1999标准(http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL# Common_ta ble_expression),但正如答案中所述,MySQL不支持它们,除了通过本机SQL查询外,它们也不支持Hibernate/JPA。 – 2013-03-29 19:43:35

+0

嗨。我正在构建一个POC作为面试测试,我正在尝试使用递归查询就像这个例子。数据库是一个H2数据库(因为这只是一个POC)。 H2支持递归查询,我使用H2控制台进行测试。但是当创建一个本地查询时,它会返回NO记录。该项目是Spring Boot + Spring Data,测试H2实例在内存中。任何输入都非常感谢。谢谢。 – 2015-08-08 12:28:44