我有一个分层数据结构,如下所示:节点映射到父节点如下:
@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,我会得到以下结果:
而且,如果我查询E,我会得到:
-E -G
等等......
答案 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