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 をクエリすると、次の結果が得られます。

  • 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;

これにより、ノードの下から上へのリストが返されます。

B、A

于 2013-12-03T07:06:59.047 に答える