2013-11-12 1 views
0

Мне немного любопытно, есть ли способ получить результат подключения по sql-запросу, например root Entity с уже отображенными потомками. Так что, если я вставить в базе что-то вроде этого:Как получить корень из рекурсивного запроса оракула в Hibernate

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 
} 

будет ba ck мне как списку теста. Можно получить корневое и полное дерево рекурсивной функцией, но он получит новый запрос на итерации (он будет очень длинным, если у меня будет большое дерево). Итак, есть ли хороший способ получить корень этого дерева с уже отображенными потомками по этому запросу (возможно, расширьте/реализуем некоторый класс/интерфейс, который будет обрабатывать отображение из jdbc в сущность)?

ответ

0

Вы можете использовать CONNECT_BY_ROOT унарный оператор. См docs

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 

BTW: это не имеет ничего общего с Hibernace. Это чисто специальное решение Oracle.

+0

thx для вас ответит, но Hibernate это главный момент, и я попытаюсь использовать ваш запрос с addRoot(), если он будет работать, я расскажу здесь. – user2982622

Смежные вопросы