2011-11-30 69 views
6

我使用Hibernate注释来存留我的类。 我目前使用以下策略来映射类Hibernate多态HQL SELECT语句

我有一个抽象类,它是父类,我有两个继承它的子类 母亲,父亲。

我映射会这样:

@MappedSuperclass 
public abstract class Parent { 

private int age; 
private String name; 
... 
} 

而其他两个类声明如下:

@Entity 
public Class Father extends Parent { 

private boolean haveMustash; 
... 
} 

所以基本上情况是“每类表”。

现在我想创建一个Hibernate HQL语句,它将更新父级的年龄,而不管它是什么样的(母亲,父亲)。将使用在两个表中都是唯一的名称列来查找父项。但如果是母亲或父亲,我不知道只是看这个名字。 如何创建一个将在两个表中查找的HQL语句,并返回更新的正确实体?

我想过这样的事情:(但我没有一个想法,如果它甚至有可能)

Parent parent = hibernateTemplate.find("from Mother,Father where name=" 
     + name); 

回答

2
from Parent p where p.name = :name 

(未测试)。

请注意,如果它工作,它将导致两个查询,因为两个实体没有任何共同之处,除了它们从超类继承一些映射的属性。您在这里没有实体继承,并且不实现每个类策略的表。如果父母使用@Entity而不是@MappedSuperClass进行注释,并且您使用@Inheritance定义了继承策略,那么您会这样做。

+0

它不工作,我得到父不映射(休眠异常) – stdcall

+0

那么,然后映射它。 –

+0

整个想法是为了不映射,它是一个抽象类,父亲和母亲从它的基本映射。 – stdcall

-1

根据Hibernate Reference这个工作!

可能出现多个类,导致笛卡尔积或“交叉”连接。

from Formula, Parameter

(见14.2)

Hibernate Reference

你也可以在这两个表搜索seperately再检查哪一个不为空?

1

JB Nizet的回答是正确的。使用@Entity来映射Parent,而不是@MappedSuperclass。这允许你在Parent上运行Hibernate查询和更新(后者只允许你在父母身上运行它)。您可以使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)注释保留每个类的表格。

from Mother,Father将不起作用,因为它隐式地加入表格。你想要的是一个工会。使用@Entity,Hibernate会自动为你做这件事。

+0

很好的解释。继承信息需要添加到Parent类中,以使Hibernate完成工作。 – germanio