Pergunta

Com o Hibernate, estou acostumado a fazer algo como o seguinte:

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

No entanto, o Eclipselink reclama muito sobre isso:

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

(A consulta na pilha é diferente da acima, mas o resultado é o mesmo)

Eu tentei combinações diferentes, nenhuma das quais funcionou:

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

Também tentei mudar para uma entidade diferente no meu modelo de domínio, suspeitando que talvez meu mapeamento não esteja correto. Ainda assim, o mesmo problema.

Será que só posso conseguir isso usando uma dica de consulta? Eu não quero fazer isso.

A propósito, estou usando o EclisElink como enviado com o NetBeans 6.8 e o Glassfish V3.

Eu apreciaria qualquer ajuda!

Rodrigo

Foi útil?

Solução

A principal questão é que a sintaxe JPQL não permite que o alias de fetch se junte e é por isso que o Eclipselink usa dicas de consulta para essa funcionalidade. Existe uma solicitação de aprimoramento para adicionar alias de junção diretamente no JPQL e, se você quiser vê -lo concluído, vote nela. ( https://bugs.eclipse.org/bugs/show_bug.cgi?id=293775 ).

-Gordon Yorke

Outras dicas

Bem, parece que não é permitido que um alias de uma adesão ao JPQL, de fato. Ele funciona com o Hibernate porque suporta o alias através do HQL e você pode emitir o HQL a um objeto de consulta JPA.

Portanto, não tive escolha a não ser mudar para consultas nomeadas com dicas de consulta. Eu realmente não gosto de declarar consultas com anotações por causa da alta verbosidade nas classes de entidade, então adicionei um arquivo Orm.xml ao frasco da unidade de persistência e fiz o seguinte:

<!-- 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>

Espero que isso dê alguma pista para quem luta com as mesmas deficiências do JPQL bruto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top