Скажем, у меня есть информация о родителях и потомках в таблице Organization следующим образом:
id name parent_id
1 A 1
2 A1 1
3 A2 1
4 A11 2
С Oracle я могу получить всех потомков или предков организации, используя «начать с/подключиться». Например, следующий sql получит все поддерево под «A», включая себя (т.е. A, A1, A2, A11)
select * from Organization start with id=1 connect by nocycle prior id=parent_id;
Или этот sql получит всех предков A11, включая себя (т.е. A11, A1, A)
with o_hier as (select o.id, o.parent_id, CONNECT_BY_ISCYCLE as lvl from Organization o start with id=4 connect by nocycle prior parent_id = id) select o.* from Organization o, o_hier where o.id = o_hier.id union all select o.* from Organization o, o_hier where o.id = o_hier.parent_id and o_hier.lvl = 1;
Теперь я хочу сопоставить эту таблицу с OrganizationEntity следующим образом:
@Entity
@Table(name = "Organization")
public class OrganizationEntity {
//getter/setter omitted for readability
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String name;
@ManyToOne(fetch = FetchType.LAZY)
@???
List<OrganizationEntity> descendants = new ArrayList<>();
@ManyToOne(fetch = FetchType.LAZY)
@???
List<OrganizationEntity> ancestors= new ArrayList<>();
}
Я знаю о возможной проблеме с производительностью, но можем ли мы сопоставить что-то подобное с помощью Hibernate/JPA?