EclipseLink JPQL (Glassfish v3): проблема синтаксиса при соединении? - PullRequest
3 голосов
/ 23 февраля 2010

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

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

Родриго

Ответы [ 2 ]

4 голосов
/ 24 февраля 2010

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

- Гордон Йорк

0 голосов
/ 25 февраля 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.

...