3 votes

Hibernate JOIN [some entity] ON jeton inattendu

J'utilise Hibernate 5.4.32.Final, lorsque j'essaie d'exécuter cette requête via spring data:

@Query("select new by.urspectr.ediprov.util.dto.TwoFieldDto(o.gln, u.email) "
            + "from OrganizationEntity o "
            + "join UserEntity u on u.organization.id = o.id "
            + "where o.gln in (:glnList)")
    List> findEmailListByGlnIn(List glnList);

En démarrant l'application, Hibernate lance une SyntaxExcepion lorsqu'il atteint le jeton UserEntity et renvoie un jeton inattendu.

Si j'essaie d'exécuter la requête du côté UserEntity, la requête se compile avec succès.

Cette version de Hibernate ne prend-elle pas en charge la syntaxe JOIN ON ? (OrganizationEntity ne contient pas de lien vers UserEntity, mais UserEntity en a un).

2voto

Philipp Points 88

La @Queryannotation s'attend par défaut à JPQL qui a sa propre syntaxe. Autant que je sache, vous ne pouvez pas faire quelque chose comme JOIN .. ON en JPQL. Je ne connais pas l'association entre vos entités mais cela devrait ressembler à ceci :

@Query("select new by.urspectr.ediprov.util.dto.TwoFieldDto(o.gln, u.email) "
            + "from OrganizationEntity o "
            + "join o.UserEntity u "
            + "where o.gln in (:glnList)")

Mais pour que cela fonctionne, il doit y avoir une association entre OrganizationEntity et UserEntity.

Comme alternative, vous pouvez toujours utiliser une requête native, où vous pourriez faire un JOIN .. ON dans votre dialecte SQL natif :

@Query(value = "SELECT ....", nativeQuery = true)

Mais cela ne devrait être qu'une option si vous êtes sûr de ne pas pouvoir le faire avec JPQL.

0voto

Faeemazaz Bhanej Points 132

Vous ne devriez pas utiliser JOIN ON explicite en HQL. Au lieu de cela, vous pouvez utiliser une jointure Implicit en HQL :

@Query("SELECT new by.urspectr.ediprov.util.dto.TwoFieldDto(o.gln, u.email) "
            + "FROM OrganizationEntity o "
            + "INNER JOIN UserEntity u "
            + "WHERE o.gln in (:glnList)")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X