2012-04-12 17 views
3

私はツリー構造をDBテーブルに格納しています。テーブルには複数のツリーを格納できます。 単一ツリーツリー内のすべてのノードを返すクエリが必要です。私はリソースとして以下のサイトを使用しましたが、それらのクエリはすべてのツリーのすべてのノードをPersistenceContextにロードします(テーブル全体をロードするのではありませんか?)。私はそれをしたくない、私は1つのツリーをロードするだけです。私はそれをどのように達成するのですか?単一ツリー内のすべてのノードを取得するためのJPAクエリ

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

[UPDATE]私はこのようなものを使用できるかどう@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 

を私は質問を持っていますが、01のように親子関係を維持するために2番目のテーブルを作成する必要があります、またはちょうど私が自己参照表を使用した場合は問題ありません。前者を使うと、もう少しメンテナンスが必要になりますし、おそらくもう少し複雑なクエリが必要になるようです。その価値はありますか?記事で扱っている問題は何か分かりません。

+0

これはあなたが私にここでくれた素晴らしいアイデアです!あなたは副詩のための道を見つけましたか? – azerafati

+0

、ここで使用しているすべてのfetchTypesはデフォルトのものです!あなたはそれらを取り除くことができ、それらはすべて同じになるでしょう – azerafati

答えて

0

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

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

+0

記事をありがとう。これは私にアイデアを与え、私は私の元の質問を更新するつもりです。 – citress

+0

私は提案されたコード/マッピングが非常に有望に見えると思います。それは期待どおりに機能しますか? – bennidi

+0

これまでの統合テストでは、すべてが正しく機能しているように見えました。 – citress

関連する問題