2010-08-19 15 views
7

La mia query desiderata è ottenere un elenco di oggetti Course che appartengono a una categoria. I miei oggetti sono i seguenti:Hibernate query ricorsiva

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

public class Category{ 
    String name; 
    Category parent; 
} 

Dal momento che le categorie di riferimento l'un l'altro, possono avere una profondità infinita:

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

Come posso interrogare per i corsi all'interno della categoria "AA", e restituire tutto Corsi associati con AA, AAA e AAB?

risposta

3

Perché non si sa quanto profonda è l'albero, è possibile utilizzare una sorta di modello come segue

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

Se siete disposti a utilizzare SQL nativa e il database supporta ricorsive espressioni di tabella comuni (praticamente tutti i principali DBMS MySQL eccezione) è abbastanza 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

Solo nel caso qualcuno è interessato [espressioni di tabella comuni sono parte di SQL: 1999] (http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL# Common_ta ble_expression), tuttavia, come menzionato nella risposta, MySQL non li supporta e nemmeno Hibernate/JPA se non tramite query SQL native. –

+0

Ciao. Sto costruendo un POC come test di intervista e sto cercando di usare una query ricorsiva proprio come in questo esempio. Il database è un database H2 (poiché si tratta solo di un POC). H2 supporta query ricorsive e l'ho testato usando la console H2. Ma quando si crea una query nativa, restituisce NESSUN record. Il progetto è Spring Boot + Spring Data, test dell'istanza H2 è in memoria. Qualsiasi input è molto apprezzato. Grazie. –