用于获取单个树中所有节点的JPA查询

时间:2012-04-12 13:21:34

标签: hibernate tree jpa-2.0

我有一个存储在数据库表中的树结构。该表可以存储多个树。我需要一个返回树中所有节点的查询。我已经使用以下站点作为资源,但是其中的查询会将所有树的所有节点加载到PersistenceContext(不是加载整个表吗?)。我不想这样做,我只想加载一棵树。我该如何实现?

我使用JPA 2和Hibernate作为提供者。

OpenJPA 1.2.x select tree structure using JPQL
http://www.tikalk.com/java/load-a-tree-with-jpa-and-hibernate#comment-1821

[更新]根据@bennidi的建议,我想知道我是否可以使用这样的东西:

@Entity
public class Node {

    private String name;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "rootId")
    private Node root;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "parentId")
    private Node parent;

    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @OrderBy("name")
    private List<Node> children = new LinkedList<Node>();
}

JPQL查询:

select distinct n from Node n left join fetch n.children where n.rootId = ROOT_ID

我确实有一个问题,我是否应该创建第二个表以保持像this article中的父子关系,或者如果我只使用自引用表就可以了。与前者配合似乎需要更多的维护,可能需要更复杂的查询。这值得么?我不确定该文章正在解决哪些问题。

1 个答案:

答案 0 :(得分:0)

我认为在关系数据库中存储递归结构是不自然的。您的问题的答案还取决于您选择的模式节点和树的模式。如果您具有将父子关系保存为外键的自引用节点表,则无法通过一个查询选择作为特定节点的子节点的所有节点。我认为你应该有一个每个树的表,并让每个节点引用它的树。然后,您只需选择特定树的所有节点,并通过分析节点来创建树结构。

看一下这篇文章:http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases