用于分层数据的动态JPA CriteriaBuilder

时间:2013-04-13 13:46:33

标签: jpa eclipselink

我有一个分层数据结构,如下所示:节点映射到父节点如下:

@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
  • 电子

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

-E  -G

等等......

1 个答案:

答案 0 :(得分:0)

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

假设[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;

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

B,A