我正在使用Hibernate注释来持久化我的课程。 目前我正在使用以下策略来映射类
我有一个抽象类,它是Parent类,我有两个继承它的子类 母亲,父亲。
我把它映射成:
@MappedSuperclass
public abstract class Parent {
private int age;
private String name;
...
}
另外两个类的声明如下:
@Entity
public Class Father extends Parent {
private boolean haveMustash;
...
}
所以基本上情况是“每班表”。
现在我想创建一个Hibernate HQL语句,它将更新父级的年龄,无论它是什么类型(母亲,父亲)。将使用name列查找父级,该列在两个表中都是唯一的。但我不知道只是看着这个名字,如果它是母亲或父亲。 如何创建将在两个表中查找并返回正确实体以进行更新的HQL语句?
我想到了这样的事情:(但我不知道是否有可能)
Parent parent = hibernateTemplate.find("from Mother,Father where name="
+ name);
答案 0 :(得分:2)
from Parent p where p.name = :name
(未经测试)。
请注意,如果它有效,它将导致两个查询,因为两个实体没有任何共同点,除非它们从超类继承了一些映射属性。您没有实体继承,也没有按类策略实现表。如果使用@Entity
而不是@MappedSuperClass
注释Parent,并且使用@Inheritance
定义了继承策略,则会这样做。
答案 1 :(得分:1)
JB Nizet的回答是正确的。使用@Entity
来映射Parent,而不是@MappedSuperclass
。这允许您在Parent上运行Hibernate查询和更新(后者只允许您在父亲和母亲上运行它)。您可以使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
注释保留每个班级的表格。
from Mother,Father
将无效,因为它隐式连接表。你想要的是一个工会。使用@Entity
,Hibernate将自动为您执行此操作。
答案 2 :(得分:0)
我迟到了7年,但是无论如何。
我实际上遇到了同样的问题。我有一个父类@MappedSuperClass和两个子类@Entity。我不希望成为父类@Entity,但仍然希望从多态查询中受益。显然,根据https://www.baeldung.com/hibernate-inheritance,您可以使用:
from insert.full.package.name.here.Parent p where p.name = :name
使用完整的类名及其包,尽管我还没有尝试过。我尝试过此之后,我可以编辑此帖子;)希望,这可以帮助某人再次遇到此问题。
编辑: 所以确实,这对我来说很好:)
答案 3 :(得分:-1)
根据Hibernate Reference,这是有效的!
可以出现多个类,从而产生笛卡尔积或“交叉”连接。
from Formula, Parameter
(见14.2)
你也可以单独在两个表中搜索,然后检查哪一个不为空?