EclipseLink JPQL (Glassfish v3):проблема с синтаксисом присоединения к выборке?
-
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.