Java 如何在Hibernate HQL中映射抽象类或接口?
假设我有一个Java 如何在Hibernate HQL中映射抽象类或接口?,java,hibernate,hql,Java,Hibernate,Hql,假设我有一个债务人类。使用Hibernate,我将这样定义类: @Entity @Table(name = "T_DEBTOR") public class Debtor { @Id @Column(name = "ID_DEBTOR") private String idDebtor; ... 我的刀将看起来像: public class DebtorDaoImpl implements DebtorDao { @PersistenceContex
债务人
类。使用Hibernate,我将这样定义类:
@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();
}
以及:
如果我让DAO保持原样,我会从Hibernate中得到以下错误:
Caused by: org.hibernate.hql.ast.QuerySyntaxException: Debtor is not mapped [select d from Debtor d]
如果我将刀换成这样:
public List<Debtor> findAllDebtors() {
Query q = em.createQuery("select d from DebtorOne d");
return (List<Debtor>) q.getResultList();
}
在道中:
@SuppressWarnings("unchecked")
public List<Debtor> findAllDebtors() {
Query q = em.createNamedQuery("findAllDebtors");
return (List<Debtor>) q.getResultList();
}
扩展的债务人
类别之一:
@Entity
@Table(name = "DEBTOR_ONE")
public class DebtorOne extends Debtor {
...
在我的道中:
public List<Debtor> findAllDebtors() {
return (List<Debtor>) em.createQuery("select d from Debtor d").getResultList();
}
公共列表findAllDebtors(){
return(List)em.createQuery(“从债务人d中选择d”).getResultList();
}
仍在向我返回由以下原因引起的错误:org.hibernate.hql.ast.QuerySyntaxException:债务人未映射[从债务人d中选择d]
这一次我错过了什么?我认为这在接口上是不可能的,但只能在一个公共抽象基类上实现,该基类将被@MappedSuperclass注释(有关更多详细信息,请参阅Hibernate文档)我认为,要使其起作用,您必须实际将
表映射到一个表,或者使用每个类的表策略(联合子类)@MappedSuperClass
似乎只实现了一种非常基本的复制属性的机制,并且不起作用,因为您无法查询超类的实例
我从链接中了解到,您已经准备好了避免在hibernate会话中映射debortwo
模式的debortorone
(否则查询debortwo
会拉入所有记录,包括debortwo
表中不存在的记录)。在这种情况下,请按照映射任何一种情况的子类
@SuppressWarnings("unchecked")
public List<Debtor> findAllDebtors() {
Query q = em.createNamedQuery("findAllDebtors");
return (List<Debtor>) q.getResultList();
}
@MappedSuperclass
public class Debtor {
@Id
@Column(name = "IDDEBTOR")
protected String idDebtor; // With getter and setter
}
@Entity
@Table(name = "DEBTOR_ONE")
public class DebtorOne extends Debtor {
...
public List<Debtor> findAllDebtors() {
return (List<Debtor>) em.createQuery("select d from Debtor d").getResultList();
}