Рекурсия HQL, как мне это сделать?

У меня есть древовидная структура, в которой каждый Node имеет родительский элемент и a Set<Node> children. Каждый Node имеет String title, и я хочу сделать запрос, в котором я выбираю Set<String> titles, являясь названием этого Node и всех родительских узлов. Как написать этот запрос?

Запрос для одного заголовка - это, но, как я уже сказал, я хотел бы, чтобы он был расширен для всей ветки родителей.

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

Приветствия

Ник

Ответ 1

Вы не можете выполнять рекурсивные запросы с помощью HQL. См. это. И, как указано, это даже не стандартный SQL. У вас есть два варианта:

  • напишите рекурсивный родной поставщик запросов
  • сделать несколько запросов. Например:

    // 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
    }
    

Я бы выбрал второй вариант.

Ответ 2

Пока невозможно запросить запрошенный рекурсивный запрос, можно запросить выборку иерархии с помощью HQL; это по крайней мере позволит вам ходить по дереву в памяти, не попадая в базу данных для каждого уровня.

select n from Node n
left join fetch n.Children