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 :
-----------------------------------------------------------------------
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
(2.)L'entité JPA 'Personne' :
-----------------------------------------------------------------------
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;
}
(3.)L'entité JPA 'Utilisateur' :
-----------------------------------------------------------------------
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;
}
(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
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 (...) {...}
  ...
(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
 
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 = ?))))")
(6.)Mes remarques et questions :
-----------------------------------------------------------------------
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