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

StackOverflow https://stackoverflow.com/questions/2319913

  •  22-09-2019
  •  | 
  •  

Вопрос

С 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.

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

Родриго

Это было полезно?

Решение

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

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

Другие советы

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

Поэтому мне ничего не оставалось, как перейти на именованные запросы с подсказками.Мне не очень нравится объявлять запросы с аннотациями из-за высокой детализации классов сущностей, поэтому я добавил файл 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top