HQL recursion, how do I do this?
You can't do recursive queries with HQL. See this. And as stated there it is not even standard SQL. You have two options:
- write a vendor-specific recursive native SQL query
make multiple queries. For example:
// 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 }
I'd definitely go for the 2nd option.
While it isn't possible to write the recursive query you're asking for, it is possible to eager fetch the hierarchy with HQL; doing this would at least allow you to walk the tree in memory without hitting the database for each level.
select n from Node n
left join fetch n.Children