如何在Hibernate中通过递归oracle查询获取root权限

时间:2013-11-12 10:42:17

标签: java sql oracle hibernate

我有点好奇,有没有办法通过sql查询获得连接结果,比如已经映射后代的root实体。 所以,如果我插入这样的基础:

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
}

它将作为测试列表返回给我。可以通过递归函数获得root和完整树,但是它会在迭代时得到新的查询(如果我有一棵大树,它会很长)。 那么有没有一种可能的方法来通过这个查询获得已经映射的后代的树的根(可能扩展/实现一些类/接口,它将处理从jdbc到实体的映射)?

1 个答案:

答案 0 :(得分: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特定的解决方案。