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 :

Problème avec LEFT OUTER JOIN


Sujet :

JPA Java

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2009
    Messages : 152
    Points : 105
    Points
    105
    Par défaut Problème avec LEFT OUTER JOIN
    Bonjour,
    Je voudrais savoir s'il est possible de faire une réelle jointure à gauche avec JPA.
    j'utilise comme implémentation de JPA(2.1) EclipseLink
    ma requête JPQL est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT y FROM YvsBaseArticles y LEFT OUTER JOIN  y.classe1 c1
    le Sql généré est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t0.id AS a1, t0.ref_art AS a2, t0.designation AS a3, t0.categorie AS a4, t0.actif AS a5, t0.date_save AS a6, t0.date_update AS a7, 
    t1.id AS classe
    FROM classes_stat t1, articles t0 
    WHERE (t1.id = t0.classe1)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t0.id AS a1, t0.ref_art AS a2, t0.designation AS a3, t0.categorie AS a4, t0.actif AS a5, t0.date_save AS a6, t0.date_update AS a7, 
    t1.id AS classe
    FROM articles t0 LEFT JOIN classes_stat t1 ON t1.id = t0.classe1
    order by  t1.id
    La conséquence immédiate de l'utilisation des table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM yvs_base_classes_stat t1,yvs_base_articles t0
    et de la clause Where plutot qu'une jointure est que mon résultat ne contient pas les Articles qui n'ont pas de classe stat
    Donc je voudrai savoir s'il y a un moyen de forcer le Sql généré à utiliser les Jointures
    Merci d'avance pour votre aide

  2. #2
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2009
    Messages : 152
    Points : 105
    Points
    105
    Par défaut
    Pour Information, et je le trouve déconcertant,
    les clause LEFT JOIN sont bien interprété si je ne demande pas des colonnes explicites. c'est-à-dire si ma requête est sous la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT y FROM YvsBaseArticles y LEFT OUTER JOIN  y.classe1 c1
    Mais si je fais plutôt ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT y.id,y.designation FROM YvsBaseArticles y LEFT OUTER JOIN  y.classe1 c1
    alors à la génération du SQL les jointures à gauche deviennent plutôt des inner join.
    C'est bien terrible; comment fait-on pour utiliser JPA dans ces cas?

  3. #3
    Membre actif
    Homme Profil pro
    Développement logiciel
    Inscrit en
    mai 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développement logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : mai 2005
    Messages : 70
    Points : 223
    Points
    223
    Par défaut
    Une des solutions est l'utilisation des graph entity:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @NamedEntityGraph(
      name = "yvsbasearticles-classe1-entity-graph",
      attributeNodes = {
        @NamedAttributeNode("classe1 ")
      }
    )
    @Entity
    public class YvsBaseArticles  {
    ...
    Et ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EntityGraph entityGraph = entityManager.getEntityGraph("yvsbasearticles-classe1-entity-graph");
    List<YvsBaseArticles> results = entityManager.createQuery("select y from YvsBaseArticles y", YvsBaseArticles.class)
      .setHint("javax.persistence.fetchgraph", entityGraph)
      .getResultList();
    Plus d'infos sur le site de Baeldung (en anglais).

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2009
    Messages : 152
    Points : 105
    Points
    105
    Par défaut
    Merci pour votre réponse et pour l'intérêt porter à ce problème.
    J'aimerais savoir que je me trompe, mais JPA ou alors sont implémentation EclipseLink a un très sérieux problème avec l'interprétation des requête portant sur les jointures à gauche (LEFT JOIN) et aussi le nombre de requête généré par se géant. Et dire qu'il nous a promis à nous développeurs de
    nous tenir tranquille parcequ'il gère le SQL pour nous

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    août 2006
    Messages
    3 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 3 270
    Points : 4 109
    Points
    4 109
    Par défaut
    Bonjour.
    Est-ce que ce sont les requêtes telles quelles ou les as-tu simplifiées ?

    Si la forme suivante fonctionne et que tu as besoin des données de la classe c1, il suffira de d'y accéder par ton resultat y, mais sans demander explicitement c1 dans le from. C'est l'utilisation classique. Il est plus rare de choisir et mixer les colonnes des différents objets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT y FROM YvsBaseArticles y LEFT OUTER JOIN  y.classe1 c1

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : octobre 2009
    Messages : 152
    Points : 105
    Points
    105
    Par défaut
    Oui en effet la requête est simplifié pour vous faciliter la lecture.
    la requête originale fait des jointures sur plusieurs classes environ 6; et nous renvoie une centaines de colonnes. Pour certains besoins, je n'ai envi de retourner que quelque colonnes renvoyer 10 colonnes est bien plus rapide que 100

    Sans trop détourner le sujet initial, je suis confronté à autre chose avec JPA et je suis très confus.
    En effet, depuis quelque semaines je me suis lancé dans une aventure d'optimisation d'une grosse application, et mon pont d'entrée choisi est JPA.
    Alors est-il normale qu'avant chaque INSERT, JPA nous génère des requêtes SELECT id FROM table WHERE id=? ? Je l'observe chaque fois qu'un ordre persist est lancé avec JPA. je rappelle que l'application utilise comme implémentation de JPA EclipseLink

Discussions similaires

  1. Problème avec LEFT OUTER JOIN
    Par Drakkhen72 dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/08/2008, 13h22
  2. problème avec LEFT OUTER JOIN
    Par tofque dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/03/2008, 11h57
  3. Problème de left outer join avec Ibatis
    Par sarsipius dans le forum JDBC
    Réponses: 1
    Dernier message: 28/02/2008, 14h51
  4. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  5. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17

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