EclipseLink JPQL (Glassfish v3): проблема синтаксиса присоединения к выборке?

С Hibernate я привык делать что-то вроде следующего:

select n from NetworkElement n join fetch n.site s where s.active is true

Однако EclipseLink много жалуется на это:

Caused by: Exception [EclipseLink-8024] (Eclipse Persistence Services - 2.0.0.v20091127-r5931): org.eclipse.persistence.exceptions.JPQLException Exception Description: Syntax error parsing the query [select n from NetworkElement n join fetch n.site s], line 1, column 49: syntax error at [s].

(Запрос в стеке отличается от приведенного выше, но результат тот же)

Я пробовал разные комбинации, ни одна из которых не сработала:

select n from NetworkElement n join fetch n.site where n.site.active is true
select n from NetworkElement n join fetch n.site as site where site.active is true

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

Может быть, я могу добиться этого только с помощью подсказки запроса? Я не хочу этого делать.

Кстати, я использую EcliseLink, поставляемый с Netbeans 6.8 и Glassfish v3.

Буду признателен за любую помощь!

Родриго


person javabeats    schedule 23.02.2010    source источник
comment
зарегистрировать проблему в системе отслеживания ошибок eclipselink   -  person Bozho    schedule 24.02.2010


Ответы (2)


Основная проблема заключается в том, что синтаксис JPQL не допускает псевдонимов соединений выборки, и поэтому EclipseLink использует подсказки запросов для этой функции. Существует запрос на улучшение, чтобы добавить выборку соединения с псевдонимом непосредственно в JPQL, и если вы хотите, чтобы он был завершен, пожалуйста, проголосуйте за него. ( https://bugs.eclipse.org/bugs/show_bug.cgi?id=293775 ).

--Гордон Йорк

person Gordon Yorke    schedule 24.02.2010
comment
Уверены ли вы? Hibernate позволяет мне делать это через JPA. Ну, это может быть расширение Hibernate, но я всегда думал, что это нативная функция JPQL. - person javabeats; 25.02.2010

Что ж, похоже, что в JPQL нельзя использовать псевдоним для объединения выборки. Он работает с Hibernate, потому что поддерживает псевдоним через HQL, и вам разрешено выдавать HQL для объекта JPA Query.

Поэтому мне ничего не оставалось, как переключиться на именованные запросы с подсказками запросов. Мне не очень нравится объявлять запросы с аннотациями из-за высокой детализации классов сущностей, поэтому я добавил файл orm.xml в jar модуля сохраняемости и сделал следующее:

<!-- Fetch network elements -->
<named-query name="fetchNetworkElements">
    <query>select n from NetworkElement n</query>
    <lock-mode>NONE</lock-mode>
    <hint name="eclipselink.join-fetch" value="n.site" />
    <hint name="eclipselink.join-fetch" value="n.site.area" />
</named-query>

Надеюсь, это даст некоторый ключ к тому, кто борется с теми же недостатками необработанного JPQL.

person javabeats    schedule 25.02.2010