2010-02-20 48 views
3

按照Hibernate文档的这一部分,我应该能够查询任何Java类的HQLHibernate的HQL与接口

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-polymorphism

不幸的是,当我运行此查询...

"from Transaction trans where trans.envelopeId=:envelopeId" 

我得到消息“交易未映射[来自交易trans其中trans.envelopeId =:envelopeId]”。

事务是一个接口,我不得不实现它的实体类,我希望在HQL查询返回一个类型事务的集合。

回答

9

事实上,根据对Polymorphic queries Hibernate文档:

Hibernate查询可以命名from子句任何Java 类或接口中。 该查询将返回延伸该类的所有 持久类的实例或实现该接口。该 下面的查询将返回所有 持久化对象:

from java.lang.Object o 

命名可能 被各种各样的持久 类实现的接口:

from Named n, Named m where n.name = m.name 

但由于接口没有被映射(因而未知),您需要在您的HQL查询中使用完全限定名称:

from qualified.name.Transaction trans where trans.envelopeId=:envelopeId 

This will返回实现您的接口的所有持久化类的实例。

0

我认为你需要将接口映射为父类和实现类作为其子类。

http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#inheritance-strategies

+0

您无法映射接口AFAIK。 – 2010-02-20 06:35:04

+0

文档说你可以。 <付款>“付款”>(付款是一个界面)。 – marklai 2010-02-20 06:40:54

+0

啊,是的,对不起,JPA不能但Hibernate可以(http://opensource.atlassian.com/projects/hibernate/browse/HHH-4413)。无论如何,你不需要。 – 2010-02-20 07:02:18

1

尝试导入接口,因此您不必指定完整路径。我使用名为imports.hbm.xml的文件来处理所有接口:

<hibernate-mapping package="com...path.to.implementations"> 
    <import class="com.path.to.interfaces.Transaction" rename="Transaction"/> 
... 
</hibernate-mapping> 

然后将其添加到配置中,就像普通映射文件一样。