HQL 递归,我该怎么做?

2022-09-03 13:08:26

我有一个树结构,每个都有一个父级和一个.每个节点都有一个 ,我想在我选择的地方做一个查询,作为这个节点和所有父节点的标题。如何编写此查询?NodeSet<Node> childrenString titleSet<String> titles

对单个标题的查询是这样的,但就像我说的,我希望它扩展到整个父分支。

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

干杯

尼克


答案 1

不能使用 HQL 执行递归查询。请参阅此内容。正如那里所说,它甚至不是标准的SQL。您有两种选择:

  • 编写特定于供应商的递归本机 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

推荐