HQL递归,我该怎么做?

nik*_*ers 15 java recursion orm hibernate hql

我有一个树结构,每个树Node都有父母和一个Set<Node> children.每个节点都有一个String title,我想在我选择的地方进行查询Set<String> titles,作为该节点和所有父节点的标题.我该如何写这个查询?

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

SELECT node.title FROM Node node WHERE node.id = :id
Run Code Online (Sandbox Code Playgroud)

干杯

Boz*_*zho 14

您不能使用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
    }
    
    Run Code Online (Sandbox Code Playgroud)

我绝对会选择第二种选择.

  • 实际上,[Common Table Expressions are part of the SQL:1999 standard](http://en.wikipedia.org/wiki/Hierarchical_and_recursive_queries_in_SQL#Common_table_expression),所以有一种方法可以做递归 SQL,但它不受 MySQL 和Hibernate/JPA 也不支持它。 (2认同)

Jam*_*ory 9

虽然无法编写您要求的递归查询,但可以使用HQL来获取层次结构; 这样做至少可以让你在内存中遍历树而不需要为每个级别访问数据库.

select n from Node n
left join fetch n.Children
Run Code Online (Sandbox Code Playgroud)