Tengo una estructura de árbol donde cada Node tiene un padre y una Set<Node> children. Cada Nodo tiene un String title, y quiero hacer una consulta donde puedo seleccionar Set<String> titles, siendo el título de este nodo y de todos los nodos principales. ¿Cómo puedo escribir esta consulta?

La consulta de un título único es esto, pero como he dicho, me gustaría que se expandió por toda la rama de los padres.

SELECT node.title FROM Node node WHERE node.id = :id

Saludos

Nik

OriginalEl autor niklassaers | 2010-03-21

2 Comentarios

  1. 14

    Usted no puede hacer consultas recursivas con HQL. Ver este. Y como se dijo no es ni siquiera el estándar SQL. Usted tiene dos opciones:

    • escribir un proveedor específico recursiva nativo Consulta SQL
    • hacer varias consultas. Por ejemplo:

      //obtain the first node using your query
      while (currentNode.parent != null) {
         Query q = //create the query
         q.setParameter("id", currentNode.getParentId());
         Node currentNode = (Node) q.getSingleResult();
         nodes.add(currentNode); //this is the Set
      }

    Me volvería a ir a por la 2ª opción.

    Sé que SQL no es recursivo, supuse que HQL fue diseñado con la superación de esta limitación en la mente.
    Me gustaría ir para Bozho la segunda solución, si el árbol no es demasiado profundo o complejo. Pero decir que el árbol es de diez «consultas» de profundidad o tiene muchos nodos, para la que desea obtener este título completo, usted podría terminar con una gran cantidad de consultas y un problema de rendimiento. Una manera de resolver esto, dependiendo de su situación, es escribir el título completo a la base de datos de guardar el registro, con el consiguiente ahorro de tiempo cuando se recuperan.
    Que es en realidad mi problema, el árbol puede ser muy profundo, que es la razón por la que me gustaría Hibernate para cuidar de la optimización de la forma de interactuar con la base de datos. Yo estaba esperando para conocer soluciones inteligentes y posiblemente conducir a una base de datos de transición en uno que puede manejar tales problemas.
    Creo que la respuesta es así: HQL no tiene la recursividad, el uso de otras estrategias de optimización. El que yo voy para que se «materializa caminos». Muchas gracias por su ayuda 🙂
    En realidad, Expresiones de Tabla Comunes son parte de SQL:1999 estándar, por lo que hay una manera de hacer recursiva SQL, pero no es compatible con MySQL y Hibernate/JPA todavía no lo soporta bien.

    OriginalEl autor Bozho

  2. 9

    Si bien no es posible escribir la consulta recursiva que estás pidiendo, es posible con ganas de recuperar la jerarquía con HQL; haciendo esto al menos te permiten recorrer el árbol en memoria sin golpear la base de datos para cada nivel.

    select n from Node n
    left join fetch n.Children

    OriginalEl autor James Gregory

Dejar respuesta

Please enter your comment!
Please enter your name here