2010-08-19 5 views
7

La requête souhaitée consiste à obtenir une liste d'objets de cours appartenant à une catégorie. Mes objets sont les suivants:Requête récursive Hibernate

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

public class Category{ 
    String name; 
    Category parent; 
} 

Étant donné que les catégories de référence l'autre, ils peuvent avoir une profondeur infinie:

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

Comment puis-je interroger des cours dans la catégorie « AA », et retourner tous Cours associés à AA, AAA et AAB?

Répondre

3

Parce que vous ne savez pas à quelle profondeur est l'arbre, vous pouvez utiliser une sorte de modèle comme suit

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

Si vous êtes prêt à utiliser SQL natif et votre base de données prend en charge les expressions de table commune récursive (essentiellement tous les principaux SGBD sauf MySQL), il est assez facile:

 
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

Juste au cas où quelqu'un est intéressés [expressions de table communes font partie du standard SQL: 1999] (http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL# Common_ta ble_expression), bien que, comme mentionné dans la réponse, MySQL ne les supporte pas et Hibernate/JPA non plus que via des requêtes SQL natives. –

+0

Salut. Je construis un POC comme un test d'entrevue et j'essaie d'utiliser une requête récursive comme cet exemple. La base de données est une base de données H2 (car il s'agit juste d'un POC). Le H2 supporte les requêtes récursives et je l'ai testé en utilisant la console H2. Mais lors de la création d'une requête native, elle ne renvoie AUCUN enregistrement. Le projet est Spring Boot + Spring Data, l'instance de test H2 est en mémoire. Toute contribution est très appréciée. Merci. –