2010-08-19 11 views
7

Poszukiwaną kwerendą jest uzyskanie listy obiektów kursu należących do kategorii. Moje obiekty są w następujący sposób:Zapytanie rekurencyjne w trybie hibernacji

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

public class Category{ 
    String name; 
    Category parent; 
} 

Ponieważ kategorie odwoływać się wzajemnie, mogą mieć nieskończoną głębokość:

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

Jak mogę zapytać o kursach w ramach kategorii „AA” i powrót wszystkich Kursy związane z AA, AAA i AAB?

Odpowiedz

3

Bo nie wiem jak głęboko jest drzewo, można użyć jakiegoś wzoru następująco

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

Jeśli są chętni do korzystania z natywnego SQL i bazy danych obsługuje rekurencyjnych wyrażeń wspólnym stole (w zasadzie wszystko, z wyjątkiem głównych DBMS MySQL) to całkiem proste:

 
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

Tylko w przypadku, gdy ktoś jest zainteresowany [Ekspresja wspólnym stole są częścią SQL: standard 1999] (http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL# Common_ta ble_expression), jednak, jak wspomniano w odpowiedzi, MySQL nie obsługuje ich ani hibernacji/JPA innych niż poprzez natywne zapytania SQL. –

+0

Witam. Buduję POC jako test rozmowy kwalifikacyjnej i próbuję użyć kwerendy rekurencyjnej, tak jak w tym przykładzie. Baza danych jest bazą danych H2 (ponieważ jest to tylko POC). H2 obsługuje kwerendy rekurencyjne i przetestowałem je za pomocą konsoli H2. Ale podczas tworzenia zapytania natywnego zwraca NO rekordów. Projekt to Spring Boot + Spring Data, test H2 instancji jest w pamięci. Wszelkie dane wejściowe są doceniane. Dzięki. –