DBテーブルに格納されているツリー構造があります。テーブルには複数のツリーを格納できます。単一のツリー内のすべてのノードを返すクエリが必要です。次のサイトをリソースとして使用しましたが、それらのサイトのクエリは、すべてのツリーのすべてのノードをPersistenceContextにロードします(テーブル全体をロードしませんか?)。私はそれをしたくありません、私はただ1本の木をロードしたいです。どうすればそれを達成できますか?
プロバイダーとしてHibernateを使用してJPA2を使用しています。
OpenJPA1.2.xJPQLを使用したツリー構造の選択
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
ただし、この記事のように親子関係を維持するために2番目のテーブルを作成する必要があるのか、それとも自己参照テーブルを使用しただけで問題ないのか、質問があります。前者を使用するには、もう少しメンテナンスが必要で、おそらくもう少し複雑なクエリが必要になるようです。その価値はありますか?記事がどのような問題に取り組んでいるのかわかりません。