5

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番目のテーブルを作成する必要があるのか​​、それとも自己参照テーブルを使用しただけで問題ないのか、質問があります。前者を使用するには、もう少しメンテナンスが必要で、おそらくもう少し複雑なクエリが必要になるようです。その価値はありますか?記事がどのような問題に取り組んでいるのかわかりません。

4

1 に答える 1

0

再帰的な構造をリレーショナルデータベースに保存するのは自然ではないと思います。また、質問に対する答えは、ノードとツリーをモデル化するために選択したスキーマによって異なります。親子関係を外部キーとして保持する自己参照ノードテーブルがある場合、1つのクエリで特定のノードの子であるすべてのノードを選択する方法はありません。ツリーごとにテーブルを用意し、各ノードにそのツリーを参照させる必要があると思います。次に、特定のツリーのすべてのノードを選択し、ノードを分析してツリー構造を作成するだけです。

この投稿をご覧ください:http://www.codeproject.com/Articles/8355/Trees-in-SQL-databases

于 2012-04-12T13:32:00.250 に答える