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 :

Jointure entre deux entités


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut Jointure entre deux entités
    Bonjour,

    J'ai cherché sur Internet, mais je n'ai pas trouvé de solution à mon problème. Je souhaite faire une jointure entre deux entités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Entity
    public class Modele {
        private Long id;
        private Long marque;
     
        [...]
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Entity
    public class Marque {
        private Long id;
        private String label;
     
        [...]
    }
    Je précise que mon application tourne sous Google App Engine et que cela abouti à certaines restrictions.

    J'ai essayé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select modele from Modele modele, Marque marque
        where modele.marque = marque.id
        and marque.label = :marque
    Mais j'obtiens un NullPointerException. Il semble que ce problème soit dû à l'implémentation JPA utilisée dans Google App Engine. Pour info, voici la trace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    java.lang.NullPointerException
    	at org.datanucleus.store.appengine.query.DatastoreQuery.getSortProperty(DatastoreQuery.java:788)
    	at org.datanucleus.store.appengine.query.JoinHelper.executeJoinQuery(JoinHelper.java:64)
    	at org.datanucleus.store.appengine.query.DatastoreQuery.executeQuery(DatastoreQuery.java:268)
    	at org.datanucleus.store.appengine.query.DatastoreQuery.performExecute(DatastoreQuery.java:239)
    	at org.datanucleus.store.appengine.query.JPQLQuery.performExecute(JPQLQuery.java:77)
    	at org.datanucleus.store.query.Query.executeQuery(Query.java:1489)
    	at org.datanucleus.store.query.Query.executeWithMap(Query.java:1398)
    	at org.datanucleus.jpa.JPAQuery.getResultList(JPAQuery.java:163)
    	at fr.hadf.batterie.dao.BackOfficeDAOImpl.getListModeles(BackOfficeDAOImpl.java:51)
    	at fr.hadf.batterie.backoffice.page.ListModeles.init(ListModeles.java:39)
    	at fr.hadf.framework.core.FrameworkServlet.doPost(FrameworkServlet.java:78)
    	at fr.hadf.framework.core.FrameworkServlet.doGet(FrameworkServlet.java:23)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    	at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:349)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:326)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
    Je n'arrive pas à contourner ce problème. Je ne suis pas calé avec JPA, alors pourriez-vous m'aider à écrire ma requête de jointure please ?

  2. #2
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    select modele from Modele modele
    C'est modele.leChampQueTuVeut, car le select prend en paramètre des noms de champ, pas des noms de type.

    Essaie avec "select modele.id", ça résoudra peut être ton problème.
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par YannPeniguel Voir le message
    C'est modele.leChampQueTuVeut, car le select prend en paramètre des noms de champ, pas des noms de type.

    Essaie avec "select modele.id", ça résoudra peut être ton problème.
    Le "select modele" permet de sélectionner tous les champs de la table Modele, enfin c'est ce que j'ai compris. Je pense que le problème ne vient pas de là, car j'ai déjà testé et ça marche. C'est la jointure qui pose problème.

  4. #4
    Membre émérite

    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Septembre 2010
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Septembre 2010
    Messages : 450
    Par défaut
    Citation Envoyé par verbose Voir le message
    Le "select modele" permet de sélectionner tous les champs de la table Modele, enfin c'est ce que j'ai compris. Je pense que le problème ne vient pas de là, car j'ai déjà testé et ça marche. C'est la jointure qui pose problème.
    Je ne connaissais pas cette syntaxe. J'ai l'habitude de requêtes SQL dans lesquels pour prendre tous les champs on stipule "table.*".
    Si vous moinsez, merci de répondre pour argumenter!
    Ma présentation

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Bon, laissez tomber les gars. En fait, il semblerait que l'implémentation JPA de Google App Engine ne supporte pas les jointures. Il faut utiliser des relations ManyToMany et autres. Or comme je l'ai expliqué, on est alors obligé d'utiliser des clés primaires de type Key, ce que je ne veux absolument pas.

    La solution que j'ai adopté est de faire deux requêtes consécutives. L'une pour récupérer l'identifiant primaire de ma Marque, et l'autre pour récupérer le Modele associé. Ca alourdit le traitement, mais c'est la seule solution que j'ai trouvé pour résoudre mon problème. De toute façon, j'utilise des DAO pour récupérer mes objets, donc il me sera facile de les adapter au mieux le jour où je voudrais changer d'environnement.

    Merci pour vos contributions les gars

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    768
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 768
    Par défaut
    Le null pointeur survient dans la methode getSortProperty.
    Il y a un tri quelpart dans ta requète ?

  7. #7
    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
    Ton mapping devrait plutôt ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Entity
    public class Modele {
        private Long id;
     
        @ManyToOne
        private Marque marque;
     
        [...]
    }
    Ainsi ta requête serait du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select modele from Modele modele
        where modele.marque.label = :marque

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par fr1man Voir le message
    Ton mapping devrait plutôt ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @Entity
    public class Modele {
        private Long id;
     
        @ManyToOne
        private Marque marque;
     
        [...]
    }
    Ainsi ta requête serait du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select modele from Modele modele
        where modele.marque.label = :marque
    Effectivement, en temps normal c'est ce que je devrais faire.

    Le problème est que dans ce cas, lorsque j'ai une association directe entre deux entités, l'implémentation JPA de Google App Engine m'oblige à utiliser des clés primaires de type com.google.appengine.api.datastore.Key. Or je ne veux pas utiliser de type spécifique à une implémentation, je veux que mon code soit portable. C'est pour cela que mes deux classes Marque et Modele ne sont pas associées.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 802
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    Le null pointeur survient dans la methode getSortProperty.
    Il y a un tri quelpart dans ta requète ?
    Non, je ne fais aucun tri, du moins rien d'explicite.

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

Discussions similaires

  1. Jointure entre deux entités
    Par Chabanus dans le forum Hibernate
    Réponses: 1
    Dernier message: 01/05/2010, 14h51
  2. [MySQL] Jointure entre deux tables
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 03/10/2005, 18h55
  3. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  4. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  5. jointure entre deux requete
    Par Youssef dans le forum Langage SQL
    Réponses: 21
    Dernier message: 15/01/2004, 15h13

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