【问题标题】:Ascend HQL inheritance hierarchy from subclass to superclass将 HQL 继承层次从子类提升到超类
【发布时间】:2021-01-11 02:13:06
【问题描述】:

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

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 1970-01-01
      • 2011-12-25
      • 2018-03-01
      • 1970-01-01
      • 2016-08-13
      • 2012-09-10
      相关资源
      最近更新 更多