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 :

Eviter les jointures externes


Sujet :

JPA Java

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 78
    Par défaut Eviter les jointures externes
    Bonjour,

    L'exécution d'une requete jpa(kodo-weblogic) me génère une requete sql avec des jointures externes qui ne sont pas nécessaires.
    Ci-dessous la définition de mes objets:
    Un objet A qui a un attribut de type B
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	@ManyToOne(cascade = {}, fetch = FetchType.EAGER)
    	@JoinColumn(name = "B_ID", unique = false, nullable = false, insertable = true, updatable = true)
    	public B getB() {
    		return this.b;
    	}
     
    	public void setB(B b) {
    		this.b = b;
    	}
    La requete jpa est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select model from A model where model.b = 'identifiant'

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    C'est à cause de ton FetchType.EAGER sur ton objet B, qui va effectuer cette jointure.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 78
    Par défaut
    Si j'enlève le EAGER et que je mets LAZY il va me générer un requete supplémentaire sur la table B or je veux conserver une seule requete avec une jointure interne.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 966
    Par défaut
    Citation Envoyé par aloha Voir le message
    Si j'enlève le EAGER et que je mets LAZY il va me générer un requete supplémentaire sur la table B or je veux conserver une seule requete avec une jointure interne.
    il n'a pas de raison de sélectionner "tous les A d'un B" d'après le code que vous montrez, cela peut donc venir de la façon dont vous définissez le OneToMany de l'autre côté de la relation…

    (et cela peut donc être une décision de prefetch : si on a besoin de ce A maintenant alors qu'il est lié à un B qui contient une liste de A : autant prendre tout ce petit monde en un seul select …)

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2003
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 78
    Par défaut
    Je veux récupérer tous les A qui ont un champ b avec un certain identifiant.

    Voici le code du côté OneToMany
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private Set<A> as = new HashSet<A>(0)	
     
    @OneToMany(cascade = { CascadeType.ALL }, fetch = FetchType.LAZY, mappedBy = "b")
    	public Set<A> getAs() {
    		return this.as;
    	}
     
    	public void setAs(Set<A> as) {
    		this.as= as;
    	}

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 277
    Par défaut
    Et avec un requête de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select model from A model inner join model.b where b = 'identifiant'

Discussions similaires

  1. Problème sur les jointures externes
    Par crashtib dans le forum SQL
    Réponses: 2
    Dernier message: 11/01/2011, 16h57
  2. Respect norme SQL par Hyperfile sur les jointures externes
    Par Arnaud B. dans le forum HyperFileSQL
    Réponses: 24
    Dernier message: 30/11/2010, 16h35
  3. Une question aux Grands du Sql, sur les jointures externes
    Par tonton67 dans le forum Développement
    Réponses: 3
    Dernier message: 26/01/2009, 10h08
  4. Eviter les DLL externes
    Par ijk-ref dans le forum C#
    Réponses: 8
    Dernier message: 14/05/2008, 01h12
  5. Choix dans les jointures externes
    Par WebPac dans le forum SQL
    Réponses: 2
    Dernier message: 21/01/2005, 13h34

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