IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Requête JPQL sur 2 entités JPA, avec une jointure.


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2007
    Messages : 59
    Par défaut Requête JPQL sur 2 entités JPA, avec une jointure.
    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

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Août 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Août 2007
    Messages : 59
    Par défaut Requête JPQL avec jointure -- Solution trouvée !
    Bonjour,
    j'ai trouvé une solution au problème. Voici les détails :

    La requête JPQL : je l'ai modifiée. (requête modifiée ci-dessous)
    -----------------------------------------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT prs FROM PERSONNE prs WHERE prs.utilisateur.identifiant = :identifiant;
    Les entités JPA "Personne" et "Utilisateur": elles sont inchangées. (voir message ci-dessus)
    Le code de création et de lancement de la requête : il est inchangé. (voir message ci-dessus)
    L'erreur d'exécution de la requête : elle a disparu. (L'exécution se déroule correctement)

    (6.)Mes conclusions :
    -----------------------------------------------------------------------
    Ma requête JPQL initiale était incorrecte, en particulier la clause WHERE :

    La clause WHERE incorrecte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    WHERE uti.id          = prs.utilisateur.id // jointure entre les 2 entités "Personne" et "Utilisateur"
    AND   uti.identifiant = :identifiant       // comparaison avec la chaîne de caractères ":identifiant"
    La clause WHERE correcte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE prs.utilisateur.identifiant = :identifiant // jointure et comparaison (les 2 opérations en une seule !!!)

    Autrement dit :
    En JPQL, dans la clause WHERE, on ne met qu'une seule égalité (prs.utilisateur.identifiant = :identifiant).
    Celui-ci effectuera les 2 opérations à la fois (la jointure et la comparaison).


    Moi qui suis débutant en JPQL, je n'avais pas compris cela !
    Pour moi, le problème est résolu.

    J'espère que mes explications ci-dessus ont été suffisamment claires !
    Et qu'elles pourront rendre service à d'autres...


    Bon courage à tous !...
    chat_roux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 06/10/2006, 14h55
  2. Réponses: 1
    Dernier message: 23/08/2006, 14h11
  3. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42
  4. Réponses: 4
    Dernier message: 27/05/2006, 20h30
  5. Réponses: 3
    Dernier message: 22/11/2005, 19h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo