Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Hibernate HQL中映射抽象类或接口?_Java_Hibernate_Hql - Fatal编程技术网

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();
}