我有存储在数据库表中的树结构。该表可以存储多棵树。我需要一个查询,它将返回单个树中的所有节点。我使用以下站点作为资源,但其中的查询会将所有树的所有节点加载到 PersistenceContext 中(不是加载整个表吗?)。我不想这样做,我只想加载一棵树。我如何做到这一点?
我使用 JPA 2 和 Hibernate 作为提供者。
OpenJPA 1.2.x 使用 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
不过,我确实有一个问题,我是否应该像本文中那样创建第二个表来维护父子关系,或者如果我只使用自引用表就可以了。使用前者似乎需要更多的维护,并且可能需要更复杂的查询。这值得么?我不确定这篇文章解决了什么问题。