Рекурсия 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