比如說,現在有4個實體:Person,Teacher,Student,和Account,Teacher和Student繼承自Person,Account與Person是單向的一對一關系。(這隻是為了舉例,請不要考慮諸如這樣的實體設計是否合理的問題)如下所示:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class Person {
......
}
@Entity
@DiscriminatorValue("teacher")
public class Teacher extends Person {
......
}
@Entity
@DiscriminatorValue("student")
public class Student extends Person {
......
}
@Entity
public class Account {
......
@OneToOne
Person person;
}
這樣做的好處是,Account隻需持有Person的引用,在實際業務中隻需要通過account.getPerson() instanceof Student這樣的方法就能夠判斷出賬号對應的身份。
但如果需要找出所有學生的賬号該怎麼辦?因為一對一的關聯是單向的,是以隻能對Account進行條件查詢。我們當然希望通過from Account a where a.person instanceof Student這樣的HQL來查出來,但HQL中并沒有instanceof這樣的功能。
其實答案很簡單:from Account a where a.person.class = "student"