0

私は少し興味があります.既にマップされた子孫を持つルートエンティティのようなSQLクエリによる接続の結果を取得する方法はありますか. したがって、ベースに挿入すると、次のようになります。

insert into table test (id, parent_id, some_text) values
(1, null, 'a'),
(2, 1, 'b'),
(3, 1, 'c'),
(4, 2, 'd');

次に、SQLクエリによって

select *
from test t
start with t.id = 1
connect by prior t.id = t.parent_id
order siblings by t.some_text

私は手に入れます

id | parent_id | some_text
 1        null           a
 2           1           b
 4           2           d
 3           1           c

およびエンティティ別

@Entity
@Table(name = "test")
public class Test {
    @Id
    @Column(name = "id")
    @GeneratedValue(generator = "increment")
    @GenericGenerator(name = "increment", strategy = "increment")
    private BigInteger id;

    @Column(name = "parent_id")
    private BigInteger parent_id;

    @Column(name = "some_text")
    private String someText;

    @OneToMany(mappedBy = "parent")
    private Set<Test> descendants;

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Test parent;
    // getters and setters
}

テストのリストとして返されます。再帰関数によってルートと完全なツリーを取得することは可能ですが、繰り返しで新しいクエリを取得します (大きなツリーがあると非常に長くなります)。したがって、このクエリによって既にマップされた子孫を持つこのツリーのルートを取得する良い方法はありますか (おそらく、jdbc からエンティティへのマッピングを処理するクラス/インターフェイスを拡張/実装します)。

4

1 に答える 1

0

CONNECT_BY_ROOT単項演算子を使用できます。ドキュメントを見る

select t.*, connect_by_root id
from test t
start with t.id = 1
connect by prior t.id = t.parent_id
order siblings by t.some_text

ところで: これは Hibernace とは関係ありません。これは、純粋に Oracle 固有のソリューションです。

于 2013-11-12T10:49:50.903 に答える