2010-08-19 34 views
7

Mi consulta deseada es obtener una lista de objetos de curso que pertenecen a una categoría. Mis objetos son los siguientes:Hibernate consulta recursiva

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

public class Category{ 
    String name; 
    Category parent; 
} 

Desde referencia a las categorías entre sí, pueden tener una profundidad infinita:

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

¿Cómo puedo consultar I de golf dentro de la categoría "AA", y devolver todo ¿Cursos asociados con AA, AAA y AAB?

Respuesta

3

Debido a que no se sabe qué tan profundo es el árbol, puede utilizar algún tipo de patrón de de la siguiente manera

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

Si usted está dispuesto a utilizar SQL nativo y su base de datos es compatible con las expresiones de tabla común recursiva (básicamente, todos los DBMS principales excepto MySQL) es bastante fácil:

 
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

por si alguien está interesado [expresiones de tabla comunes son parte del estándar SQL: 1999] (http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL# Common_ta ble_expression), sin embargo, como se menciona en la respuesta, MySQL no los admite y Hibernate/JPA tampoco lo hace a través de consultas SQL nativas. –

+0

Hola. Estoy construyendo un POC como una prueba de entrevista y estoy tratando de usar una consulta recursiva como en este ejemplo. La base de datos es una base de datos H2 (ya que es solo un POC). El H2 admite consultas recursivas y lo probé usando la consola H2. Pero al crear una consulta nativa, devuelve NO registros. El proyecto es Spring Boot + Spring Data, la instancia H2 de prueba está en la memoria. Cualquier aporte se agradecerá. Gracias. –

Cuestiones relacionadas