2010-08-19 13 views
7

Meine gewünschte Abfrage ist eine Liste der Kursobjekte, die zu einer Kategorie gehören. Meine Objekte sind wie folgt:Hibernate rekursive Abfrage

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

public class Category{ 
    String name; 
    Category parent; 
} 

Da die Kategorien aufeinander verweisen, können sie eine unendliche Tiefe haben:

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

Wie kann ich für die Kurse in der Kategorie „AA“ abfragen und kehren alle Kurse in Verbindung mit AA, AAA und AAB?

Antwort

3

Weil Sie wissen nicht, wie tief der Baum ist, können Sie eine Art von Muster verwenden wie

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

Wenn Sie bereit sind, verwenden nativen SQL und Ihre Datenbank unterstützt rekursive allgemeine Tabellenausdrücke (im Grunde alle wichtigen DBMS außer MySQL) ist es ziemlich einfach:

 
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

Nur falls jemand interessiert [Common Table Expressions sind Teil der SQL: 1999-Standard] (http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL# Common_ta ble_expression), wie in der Antwort erwähnt, unterstützt MySQL sie nicht und Hibernate/JPA auch nicht über native SQL-Abfragen. –

+0

Hallo. Ich baue ein POC als Interview-Test und versuche, eine rekursive Abfrage wie dieses Beispiel zu verwenden. Die Datenbank ist eine H2-Datenbank (da dies nur ein POC ist). Der H2 unterstützt rekursive Abfragen und ich habe es mit H2-Konsole getestet. Beim Erstellen einer systemeigenen Abfrage werden jedoch keine Datensätze zurückgegeben. Das Projekt ist Spring Boot + Spring Data, die Test H2-Instanz befindet sich im Speicher. Jede Eingabe wird sehr geschätzt. Vielen Dank. –