2010-02-20 3 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" 

Получаю сообщение «Транзакция не отображается [из Transaction trans где trans.envelopeId =: envelopeId]».

Сделка - это интерфейс, у меня есть классы сущностей, которые его реализуют, я хочу, чтобы в запросе HQL возвращалась коллекция типа Transaction.

ответ

9

Действительно, в соответствии с документацией гибернации на Polymorphic queries:

Hibernate запросы могут назвать любой 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 

Этот будет возвращает экземпляры всех постоянных классов, которые реализуют ваш интерфейс Transaction.

0

Я думаю, вам нужно отобразить интерфейс как родительский класс и классы-реализации в качестве своего подкласса.

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

+0

Вы не можете перенастроить интерфейс AFAIK. –

+0

Документы говорят, что вы можете. (Платеж - это интерфейс). – marklai

+0

Ах да, извините, JPA не может, но Hibernate может (http://opensource.atlassian.com/projects/hibernate/browse/HHH-4413). Во всяком случае, вам не нужно. –

1

Попробуйте импортировать интерфейсы, поэтому вам не нужно указывать полный путь. Я использую файл с именем imports.hbm.xml обрабатывать все интерфейсы:

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

Затем добавить, что в конфигурации так же, как обычный файл отображения.