首页 > 解决方案 > 将 HQL 继承层次从子类提升到超类

问题描述

给定三个实体 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读取,特别是. 我想知道这在hibernate中是否可行。否则,任何替代解决方案都将受到欢迎。Ac

标签: javahibernatehql

解决方案


更改C内部实例变量的可见性A

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

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

这种方式在任何实例中c都是可见的,从而导致有效。结果,将识别为有效命令。BbInstance.chibernateselect b from B b join b.c c


推荐阅读