想象一下,我有一個Debtor
類。與Hibernate,我會定義類這樣的:如何在Hibernate HQL中映射抽象類或接口?
@Entity
@Table(name = "T_DEBTOR")
public class Debtor {
@Id
@Column(name = "ID_DEBTOR")
private String idDebtor;
...
吾道也就那麼樣子:
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();
}
這種運作良好。但是,我處於需要訪問不同模式的配置中(如指向here)。當然,在每個模式中,承載債務人清單的表格都不具有相同的名稱。除此之外,它們可能不具有完全相同的結構。那爲什麼我有x differents Debtor
class(其中x是我操作的模式的數量)。
在我有兩個不同的模式的情況下,我將有兩個不同的Debtor
類:DebtorOne
和DebtorTwo
。 因爲我想減輕我的發展,我創建了一個接口(或抽象類,它不會改變我在這裏的問題)是由兩個DebtorOne
和DebtorTwo
實施:
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,因爲它是我從休眠出現以下錯誤:
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();
}
我沒有嘗試過,但我認爲它會工作...
編輯我只是嘗試,這將工作...除了NamedQuery
必須命名不同DebtorOne
和DebtorTwo
...
但是,我想知道是否有辦法解決我的問題而不使用後一種解決方案?
編輯關於第一個答案,這表明使用@MappedSuperclass
。這個註釋似乎對我來說是一個完美的解決方案,但我想我忘了一些東西,因爲我仍然得到同樣的錯誤。
主要Debtor
:
@Entity
@Table(name = "DEBTOR_ONE")
public class DebtorOne extends Debtor {
...
,並在我的DAO:
@MappedSuperclass
public class Debtor {
@Id
@Column(name = "IDDEBTOR")
protected String idDebtor; // With getter and setter
}
擴展Debtor
類的一個
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]
這次我錯過了什麼?