Hibernate Polymorphic HQL SELECT语句

时间:2011-11-30 08:28:13

标签: java hibernate polymorphism hql

我正在使用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);

4 个答案:

答案 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)

Hibernate Reference

你也可以单独在两个表中搜索,然后检查哪一个不为空?