1

我有一个分层数据结构如下其中节点映射到父节点如下:

@Entity
public class Node implements Serializable { 
    @Id
    private long id;

     @Column(name="PARENT_ID")
     private Long parentId;

    @OneToMany    
    @JoinColumn(name="PARENT_ID")    
    public List<Node> children = new LinkedList<Node>();

}

例如,假设我有以下数据:

          [A]
          / \
         /   \
        /     \
     [B]      [C]
     / \        \
    /   \        \
  [D]   [E]      [F]
          \
           \
           [G]

现在我想在 JPA CriteriaBuilder 中构建一个动态查询,它可以查询任何节点并返回其子节点的结果。例如,如果我查询 B,我会得到以下结果:

  • D
  • G

而且,如果我查询 E,我得到:

-E -G

等等...

4

1 回答 1

0

由于我使用 SQL Server 2012 作为我的数据库,因此我使用了 with 子句,如下所示:

假设 [E] 节点 id 为 8:

从上到下:

WITH NODE_TREE AS(
     SELECT N.ID, N.PARENT_ID FROM NODE_TABLE N WHERE N.ID = 8
     UNION ALL
     SELECT N.ID, N.PARENT_ID FROM NODE_TABLE N
     INNER JOIN NODE_TREE NT
     ON N.ID = NT.PARENT_ID
)

SELECT * FROM NODE_TREE;

这将返回一个从上到下的节点列表:

B、E、D、G

从下到上:

WITH NODE_TREE AS(
     SELECT N.ID, N.PARENT_ID FROM NODE_TABLE N WHERE N.ID = 8
     UNION ALL
     SELECT N.ID, N.PARENT_ID FROM NODE_TABLE N
     INNER JOIN NODE_TREE NT
     ON N.PARENT_ID = NT.ID
)

SELECT * FROM NODE_TREE;

这将返回一个从下到上的节点列表:

乙,甲

于 2013-12-03T07:06:59.047 回答