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 :

[NB6.5.1+GlassFish2.1] WS: comment requêter sur 2 tables [Débutant]


Sujet :

JPA Java

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut [NB6.5.1+GlassFish2.1] WS: comment requêter sur 2 tables [Débutant]
    Bonjour à tous,

    J'apprends à développer des Web Services. Je suis parvenu à en faire en piochant les données d'une seule table, et maintenant, je souhaite piocher dans plusieurs tables à la fois.

    J'ai 3 tables :
    - [pilote] : idx, name, nationality, age, sexe
    - [circuit] : idx, name, country, city, length
    - [victoire] : pilote_idx, circuit_idx, runDate, runPlace, runTime
    (souligné: primary key)

    J'ai 4 classes dans la couche JPA:
    - Pilote.java
    - Circuit.java
    - Victoire.java
    - VictoirePK.java
    et 6 dans la couche EJB:
    - PiloteFacade.java + PiloteFacadeLocal.java
    - CircuitFacade.java + CircuitFacadeLocal.java
    - VictoireFacade.java + VictoireFacadeLocal.java

    Voilà, jusque là, tout a été généré automatiquement.

    Je souhaite créer un WebService qui me retourne la liste des pilotes avec le nombre de fois qu'ils ont terminé à la première place (donc récupération des "0 fois" aussi).
    Voici ma requête (testée et fonctionnelle sous MySQL):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT p.name, Count(v.pilote_idx) nb
    FROM pilote p
    LEFT OUTER JOIN victoire v
    ON p.idx = v.pilote_idx AND v.place = 1
    GROUP BY p.name
    ORDER BY nb DESC, p.name ASC;
    Je l'ai placée dans un @NamedQuery de Pilote.java (JPA). Je ne sais pas si j'ai bien fais.

    Mais avec tout ça, je ne sais pas quoi faire pour faire fonctionner mon WebService. Voici ce que j'ai tenté :
    1-
    . créer une classe [DevClass] : name, nbVictories
    . dans PiloteFacade(Local), ajouter la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public List<DevClass> getVictories() {
    return em.createQuery("MA_REQUETE_CI_DESSUS").getResultList();
    }
    . mais quand je teste la méthode via le Web Service, j'obtiens une jolie exception :
    Service invocation threw an exception with message : null; Refer to the server log for more details
    Exceptions details : java.lang.reflect.InvocationTargetException
    2-
    . en essayant de rajouter @ManyToOne en suivant ce tuto ou celui-ci, soit j'obtiens la même erreur, soit mon serveur plante (impossible d'undeploy, de lancer un WS, ou autre si je ne redémarre pas GlassFish).


    Voilà, je sèche un peu.
    Quelqu'un saurait-il m'aiguiller?


    Merci d'avance...

    ps: pour les plus courageux :
    Service invocation threw an exception with message : null; Refer to the server log for more details

    Exceptions details : java.lang.reflect.InvocationTargetException
    javax.servlet.ServletException: java.lang.reflect.InvocationTargetException at com.sun.enterprise.webservice.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:345) at com.sun.enterprise.webservice.monitoring.WebServiceTesterServlet.invoke(WebServiceTesterServlet.java:121) at com.sun.enterprise.webservice.JAXWSServlet.doPost(JAXWSServlet.java:166) at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) Caused by: java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.sun.enterprise.webservice.monitoring.WebServiceTesterServlet.doPost(WebServiceTesterServlet.java:316) ... 31 more Caused by: javax.xml.ws.soap.SOAPFaultException: javax.ejb.EJBException at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:188) at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:108) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:119) at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89) at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118) at $Proxy171.getWons(Unknown Source) ... 36 more

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Chalut

    Dis moi avant de passer le résultat par appel webservice, as tu testé (junit) ton code coté server? Je pense qu'il faut y aller par étape

    Sinon quelques remarques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT p.name, Count(v.pilote_idx) nb
    FROM pilote p
    LEFT OUTER JOIN victoire v
    ON p.idx = v.pilote_idx AND v.place = 1
    GROUP BY p.name
    ORDER BY nb DESC, p.name ASC;
    L'attribut de ton entity se nomme pilote_idx ? ca ressemble au nomage dans ta base, et non des attributs entity.

    p.idx = v.pilote_idx c'est une jointure ? logiquement si ton mapping est bien fait pas besoin de ca.

    J'ai toujours trouvé le comportement de LEFT OUTER JOIN etrange, (utilisant oracle mes outer sont sur les attributs), et il me semble qui te faudra faire un truc du genre : where (v.id is null) or (v.place=1) (a confirmer)

    Tu n'as pas de close where?

    Tu declares un @NamedQuery et tu utilises un em.createQuery ca me parait bizar.

    L'erreur affichée est une erreur cliente :/
    Mon site : TKT-Web =)

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2009
    Messages : 37
    Points : 40
    Points
    40
    Par défaut
    Salut, et merci de te pencher sur mon soucis


    Non, je n'ai pas testé côté serveur, je ne sais pas comment faire :s vais me renseigner sur JUnit...

    Euh, pour la requête, tu as raison, ce n'est pas le nommage des attributs Entity (vais me pencher dessus donc, car c'est encore floue).

    Pour la jointure, je ne savais pas qu'il n'y en n'avait pas besoin. Par contre, question mapping, est-ce que je dois faire la jointure dans victoire.java ou victoirePK.java (qui lui est inclu dans victoire.java pour définir ma clé primaire)?

    Pour mon LEFT OUTER JOIN, il fonctionne sous MySQL, après, me suis pas posé de question supplémentaire

    Euh, sinon, pour le namedquery, j'ai fais :
    - @NamedQuery(name="TOTO.FaisUnTest", query="MA_REQUETE")
    - em.createQuery("TOTO.FaisUnTest").getResultList();
    J'ai faux?
    En testant sur mon findAll(), ça a l'air de fonctionner pourtant :s Un effet de bord?

    L'erreur affichée est une erreur cliente :/
    Comment tu sais ? dis-moi où je peux voir ça


    Bon, bah j'ai déjà quelques pistes, merci.
    J'vous dirais lundi si j'ai avancé ou pas. Bon week-end à ceux qu'en ont un =)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 149
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    Alors oui pour junit regarde un peu tu iras bcp plus vite à tester tes DAO sans lancer ton serveur d'appli. Ou fait un main (enfin bon c'est moins top )
    Bon le truc c'est qu'il te faut instancier tout ca par spring, en gros ca peu donner un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class PiloteFacadeLocalTest{
     
       @Test
       public void getVictoriesTest()
       {
    	ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
    		new 	String[]   {
    					"spring-dataSource.xml", ... etc
    					});
            PiloteFacadeLocal dao (PiloteFacadeLocal) = applicationContext.getBean("PiloteFacadeLocal");
            List<DevClass> list=dao.getVictories();
       }
    }
    Pour ta requete je te conseil de récupérer une liste de pilote, tu pourras ainsi récupérer le nom (pilote.getName()) et le nombre de victoire (pilote.getListVictoire().size()), et tu fais pas une nouvelle classe uniquement pour une requete.

    Pour ta pk, si ton mapping est bien fait, ne t'en occupes pas dans ta requete, c'est géré tout seul.

    Pour le named query il faut que tu fasse em.createNamedQuery plutot :
    http://download.oracle.com/docs/cd/B...nt30qry001.htm

    Pour l'erreur je ne connais pas très bien les webservices, mais la stack montre que c'est la partie consomatrice du webservice qui explose (enfin ce que j'en lis =)

    J'éspère t'avoir un peu plus aidé
    Mon site : TKT-Web =)

Discussions similaires

  1. [AC-2007] Requête sur 2 tables mais je ne sais pas comment la faire ?
    Par tibofo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/01/2012, 00h01
  2. Réponses: 22
    Dernier message: 10/07/2011, 17h49
  3. Comment faire une double requête sur une table
    Par giova_fr dans le forum Langage SQL
    Réponses: 6
    Dernier message: 04/06/2010, 18h08
  4. Réponses: 5
    Dernier message: 08/01/2007, 21h03
  5. Requête sur 2 tables et surtout novice...
    Par kibodio dans le forum Langage SQL
    Réponses: 13
    Dernier message: 03/03/2005, 15h45

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