Hibernate HQL с интерфейсами

Согласно этому разделу документации Hibernate, я должен иметь возможность запрашивать любой класс Java в 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.


person benstpierre    schedule 20.02.2010    source источник


Ответы (3)


Действительно, согласно документации Hibernate по полиморфному запросы:

Запросы Hibernate могут называть любой класс или интерфейс Java в предложении from. Запрос вернет экземпляры всех постоянных классов, которые расширяют этот класс или реализуют интерфейс. Следующий запрос вернет все постоянные объекты:

from java.lang.Object o

Интерфейс Named может быть реализован различными персистентными классами:

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

Но поскольку интерфейс не отображается (и, следовательно, неизвестен), вам нужно использовать полное имя в вашем запросе HQL:

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

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

person Pascal Thivent    schedule 20.02.2010

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

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

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

person Brian Deterling    schedule 20.02.2010

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

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

person marklai    schedule 20.02.2010
comment
Вы не можете сопоставить интерфейс AFAIK. - person Pascal Thivent; 20.02.2010
comment
Документы говорят, что можно. ‹class name=Payment table=PAYMENT› (Платеж — это интерфейс). - person marklai; 20.02.2010
comment
Ах да, извините, JPA не может, а Hibernate может (opensource.atlassian.com /projects/hibernate/browse/HHH-4413). Во всяком случае, вам не нужно. - person Pascal Thivent; 20.02.2010