从子类到超类提升HQL继承层次

Ascend HQL inheritance hierarchy from subclass to superclass

给定三个实体 A、B 和 C,其中 B 扩展了 A,例如:

@Entity
@Table(name = "a")
public class A {
    private C c;
    //omitted source code

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "c_id", nullable = false)
    public C getC() {
       return c;
    }
    public void setC(C c){
       this.c=c;
    }
}

@Entity
@Table(name = "b")
public class B extends A {
    private Integer id;
    //omitted source code
}

@Entity
@Table(name = "c")
public class C {
    private Integer id;
    private String status;
    //omitted source code
}

如何将以下原生 SQL 转换为 HQL :

select b.* from b b_
inner join a a_ on a_.id=b_.id
inner join c c_ on a_.c_id=c_.id
where c_.status='ACCEPTED';

我尝试了以下操作:select b from B b join b.c c where c.status = 'ACCEPTED' 但是我得到了这个异常:org.hibernate.QueryException: could not resolve property: c of: B。我以为 Hibernate 会在运行时解析超类字段。

我在这里试图实现的是从 from B 开始提升继承层次并读取超类 A 内部字段,特别是 c。我想知道这在休眠中是否可行。否则任何替代解决方案都将非常受欢迎。

更改 C 实例变量在 A 中的可见性:

public class A {
    protected C c;
    //....

protected 确保 A 的子级( 以及 A 位于 的同一包中的其他成员)能够直接访问 c,因为它变成了 继承变量 .

这样,c 对任何 B 实例都是可见的,从而使 bInstance.c 有效。因此,hibernate 会将 select b from B b join b.c c 识别为有效命令。