[英]How to map an abstract class or interface in Hibernate HQL?
想象一下,我有一個Debtor
班。 使用Hibernate,我將像這樣定義類:
@Entity
@Table(name = "T_DEBTOR")
public class Debtor {
@Id
@Column(name = "ID_DEBTOR")
private String idDebtor;
...
然后,我的DAO將如下所示:
public class DebtorDaoImpl implements DebtorDao {
@PersistenceContext
private EntityManager em;
@SuppressWarnings("unchecked")
public List<Debtor> findAllDebtors() {
Query q = em.createQuery("select d from Debtor d");
return (List<Debtor>) q.getResultList();
}
這很好。 但是,我處於需要訪問差異模式的配置中(如此處所述 )。 當然,在每個模式中,主持債務人列表的表的名稱都不相同。 除此之外,它們可能沒有完全相同的結構。 這就是為什么我有x個不同的Debtor
類(其中x是我操作的模式數量)的原因。
在我有兩個型動物模式的情況下,我將有兩個不同的Debtor
類: DebtorOne
和DebtorTwo
。 為了簡化開發,我創建了一個由DebtorOne
和DebtorTwo
都實現的Interface(或Abstract類,在這里不會改變我的問題):
public interface Debtor {
String getIdDebtor();
}
和:
@Entity
@Table(name = "T_DEBTOR_ONE")
public class DebtorOne implements Debtor {
@Id
@Column(name = "ID_DEBTOR")
private String idDebtor;
...
如果我照原樣執行DAO,則會從Hibernate中收到以下錯誤消息:
Caused by: org.hibernate.hql.ast.QuerySyntaxException: Debtor is not mapped [select d from Debtor d]
如果我將DAO更改為具有以下內容:
public List<Debtor> findAllDebtors() {
Query q = em.createQuery("select d from DebtorOne d");
return (List<Debtor>) q.getResultList();
}
然后就可以了,但是它特定於DebtorOne
模式...
我看到的一個解決方案是在DebtorOne
和DebtorTwo
類上定義一個命名查詢,然后從我的DAO中調用此命名查詢。 換句話說:
@Entity
@Table(name = "T_DEBTOR_ONE")
@NamedNativeQueries( { @NamedNativeQuery(name = "findAllDebtors", query = "select d from DebtorOne d") })
public class DebtorOne implements Debtor {
在DAO中:
@SuppressWarnings("unchecked")
public List<Debtor> findAllDebtors() {
Query q = em.createNamedQuery("findAllDebtors");
return (List<Debtor>) q.getResultList();
}
我還沒有嘗試過,但是我認為它可以工作...
我剛試過的EDIT ,它將起作用...除了NamedQuery
必須為DebtorOne
和DebtorTwo
命名不同DebtorTwo
...
但是,我想知道是否有辦法不使用后一種解決方案來解決我的問題?
編輯第一個答案,建議使用@MappedSuperclass
。 這個批注似乎對我來說是完美的解決方案,但是我仍然忘記了一些東西,因為我仍然遇到相同的錯誤。
主要Debtor
:
@MappedSuperclass
public class Debtor {
@Id
@Column(name = "IDDEBTOR")
protected String idDebtor; // With getter and setter
}
擴展的Debtor
類別之一:
@Entity
@Table(name = "DEBTOR_ONE")
public class DebtorOne extends Debtor {
...
在我的DAO中:
public List<Debtor> findAllDebtors() {
return (List<Debtor>) em.createQuery("select d from Debtor d").getResultList();
}
仍向我返回錯誤Caused by: org.hibernate.hql.ast.QuerySyntaxException: Debtor is not mapped [select d from Debtor d]
我這次想念什么?
我認為這不可能通過接口實現,而只能通過通用的抽象基類實現,該類將使用@MappedSuperclass進行注釋(有關更多詳細信息,請參見Hibernate文檔)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.