Bonjour,
je fais appel à votre aide concernant le sujet suivant :
Une requête JPQL qui accède à 2 entités JPA, avec une jointure.
Ci-dessous, la description du problème que je rencontre :
(1.)La requête JPQL :
-----------------------------------------------------------------------
(2.)L'entité JPA 'Personne' :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PERSONNE_FINDBYUTILISATEUR = SELECT prs FROM Personne prs, Utilisateur uti WHERE uti.id = prs.utilisateur.id AND uti.identifiant = :identifiant
-----------------------------------------------------------------------
(3.)L'entité JPA 'Utilisateur' :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 @Entity @Inheritance(strategy= InheritanceType.JOINED) @DiscriminatorColumn(name="PERSONNETYPE") @DiscriminatorValue(value="PERSONNE") @NamedQuery(name="Personne.findByUtilisateur", query=PersonneConstants.PERSONNE_FINDBYUTILISATEUR) public class Personne implements Serializable { @Id private Long id; @OneToOne private Utilisateur utilisateur; }
-----------------------------------------------------------------------
(4.)Le code de création et de lancement de la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 @Entity public class Utilisateur implements Serializable { @Id private Long id; private String identifiant; }
-----------------------------------------------------------------------
(5.)L'erreur d'exécution de la requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ... TypedQuery<Personne> personneQuery; personneQuery = em.createNamedQuery("Personne.findByUtilisateur", Personne.class); personneQuery.setParameter(UtilisateurConstants.UTI_IDENTIFIANT, identifiant); Personne personneResult; try { personneResult = personneQuery.getSingleResult(); ... } catch (...) {...} ...
-----------------------------------------------------------------------
(6.)Mes remarques et questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Internal Exception: com.microsoft.sqlserver.jdbc.SQLServerException: L'identificateur en plusieurs parties "PERSONNE.PERSONNETYPE" ne peut pas être lié. Error Code: 4104 Call: SELECT DISTINCT PERSONNE.PERSONNETYPE FROM UTILISATEUR t0, PERSONNE t2, UTILISATEUR t1 WHERE (((t0.UTI_ID = t1.UTI_ID) AND (t0.UTI_IDENTIFIANT = ?)) AND ((t0.UTILISATEURTYPE = ?) AND ((t1.UTI_ID = t2.UTILISATEUR_UTI_ID) AND (t1.UTILISATEURTYPE = ?)))) bind => [3 parameters bound] Query: ReadAllQuery(name="Personne.findByUtilisateur" referenceClass=Personne sql="SELECT DISTINCT PERSONNE.PERSONNETYPE FROM UTILISATEUR t0, PERSONNE t2, UTILISATEUR t1 WHERE (((t0.UTI_ID = t1.UTI_ID) AND (t0.UTI_IDENTIFIANT = ?)) AND ((t0.UTILISATEURTYPE = ?) AND ((t1.UTI_ID = t2.UTILISATEUR_UTI_ID) AND (t1.UTILISATEURTYPE = ?))))")
-----------------------------------------------------------------------
Il y a DES DIFFERENCES IMPORTANTES entre :
-La requête SQL qui a été exécutée. (voir message d'erreur).
-La requête JPQL qui aurait dû être exécutée. (voir (1) ci-dessus).
Est-ce normal ? (J'en déduis que JPA a 'modifié' ma requête JPQL avant son exécution.)
Sachant que d'autres requêtes JPQL, dans mon application, ont été exécutées normalement (sans subir cette 'modification').
Comment corriger cette erreur ?
Dois-je réécrire la syntaxe JPQL ?
Dois-je réécrire le code de création et de lancement ?
Je suis bloqué. Merci d'avance pour vos aides.
chat_roux
Partager