从子类到超类提升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
识别为有效命令。
给定三个实体 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
识别为有效命令。