2011-11-30 91 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