java - 将 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中是否可行。否则,任何替代解决方案都将受到欢迎。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
推荐阅读
- c# - 在 .Net Framework 4.7 应用程序中使用 .Net 标准库
- javascript - 如何通过设置一周的第一天对一周中的几天进行排序?
- laravel - 如何在laravel中的多个关系上获得withCount的总和
- flutter - 如何使用 scopeModel 在 Flutter 中监听 Firestore 文档中的实时变化
- javascript - JavaScript 括号解释
- c# - 如何在 c# 模型中的 typescript 中转换 propName: string: any?
- ruby - 在 Windows 上安装 ruby 版本 2.1.2 没有成功
- ruby-on-rails - 在Rails中提交表单之前,有没有办法覆盖选择中禁用选项的id
- java - Double.parseDouble 丢失小数位
- javascript - jQuery 表单验证在 JSP 中不起作用