在一个Hibernate应用程序中,我们正在处理一个带有分层数据的表(Oracle数据库)。
为简单起见,我将举一个有父亲的人的例子(假设等级不固定,范围可以超过3个级别)。
每个人都可能拥有一辆车(也许有几辆车)。
@Entity
class Person
{
@Id
private String id;
@ManyToOne
@JoinColumn(name = "FATHER_ID")
private Person father;
}
@Entity
class Car
{
@Id
private String id;
@ManyToOne
private Person owner;
}
到目前为止,每当我们需要获取一个人的后代的所有汽车时,我们都会发出一个本机查询,以获取所有后代的ID,然后发出第二个hql查询来获取汽车本身(使用IN子句,将先前获取的ID作为绑定参数)。
我不喜欢它,因为它弄脏了我们的代码并导致我们发出超出实际需要的查询。
此外,我们还是在滥用IN子句,对许多查询使用不同数量的绑定参数。
所以我决定尝试使用Hibernate封装此分层数据。
我尝试使用@JoinFormula来使该人的后代成为数据成员,如下所示:
@Entity
class Person
{
...
@JoinFormula(value = "SELECT p.id FROM Person p START WITH p.id = id CONNECT BY PRIOR p.id = father_id", referencedColumnName = "id")
@OneToMany
List<Person> descendants;
}
不幸的是,它不起作用,休眠会抛出异常:
ClassCastException: org.hibernate.mapping.Formula cannot be cast to org.hibernate.mapping.Column
我尝试将与@ManyToMany的关系更改为,它修复了ClassCastException,但随后休眠只是忽略了公式并创建了一个新表。
我现在正在考虑使用sql函数检索后代ID,并在我的hql中使用它。 但是我不太确定该怎么做...
任何帮助将不胜感激!