2010-02-20 77 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> 

然後將其添加到配置中,就像普通映射文件一樣。