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 :

select tout simple


Sujet :

JPA Java

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut select tout simple
    Bonjour,

    J'utilise JPA avec GWT.
    J'ai créé cette méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @SuppressWarnings("unchecked")
    	public List<Person> getAllUsers() {
    		EntityManager em = EMF.get().createEntityManager();
    		try {
    			Query query = em.createQuery("SELECT p FROM " + Person.class.getName() + " p");
    			return (List<Person>)query.getResultList();
    		} finally {
    	        em.close();
    	    }
    	}
    en debug sous eclipse, cette méthode me retourne un objet StreamingQueryResult de valeur:

    com.sun.jdi.InvocationException occurred invoking method.

    La requête vous parait correct?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2008
    Messages : 33
    Par défaut
    Je pense que tu peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return em.createQuery("select from " + Person.class.getName()).getResultList();
    qui devrait fonctionner.

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut
    Merci pour ta réponse.

    J'ai le même problème avec cette requête.

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Septembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 2
    Par défaut
    Au lieu d'écrir la requête comme suit :
    "SELECT p FROM " + Person.class.getName() + " p",
    mieu vaut faire ca :
    "SELECT p FROM Person p"
    car Person.class.getName() retourne le nom complet de la classe avec celui du pacquage.

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut
    dans ce cas, comment est fait le mapping entre la classe Person persistée et le Person de la requete?

    Parce que j'obtiens cette exception :

    org.datanucleus.exceptions.ClassNotResolvedException: Person
    javax.persistence.PersistenceException: Person

    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
    42
    43
    44
    45
    46
    47
    48
    49
     
    com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract java.lang.Boolean com.picon.arnotjevleesch.client.services.LoginService.login(java.lang.String,java.lang.String)' threw an unexpected exception: javax.persistence.PersistenceException: Person
    	at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:360)
    	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:546)
    	at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:166)
    	at com.google.gwt.user.server.rpc.RemoteServiceServlet.doPost(RemoteServiceServlet.java:86)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:713)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
    	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
    	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
    	at org.mortbay.jetty.Server.handle(Server.java:313)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:844)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:644)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
    	at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
    Caused by: javax.persistence.PersistenceException: Person
    	at org.datanucleus.jpa.NucleusJPAHelper.getJPAExceptionForNucleusException(NucleusJPAHelper.java:276)
    	at org.datanucleus.jpa.JPAQuery.getResultList(JPAQuery.java:169)
    	at com.picon.arnotjevleesch.server.data.BoUser.getAllUsers(BoUser.java:37)
    	at com.picon.arnotjevleesch.server.LoginServiceImpl.login(LoginServiceImpl.java:26)
    	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:585)
    	at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:527)
    	... 25 more
    Caused by: org.datanucleus.exceptions.ClassNotResolvedException: Person
    	at org.datanucleus.util.Imports.resolveClassDeclaration(Imports.java:194)
    	at org.datanucleus.query.compiler.JavaQueryCompiler.compileFrom(JavaQueryCompiler.java:209)
    	at org.datanucleus.query.compiler.JPQLCompiler.compile(JPQLCompiler.java:72)
    	at org.datanucleus.store.query.AbstractJPQLQuery.compileInternal(AbstractJPQLQuery.java:242)
    	at org.datanucleus.store.query.Query.executeQuery(Query.java:1430)
    	at org.datanucleus.store.query.Query.executeWithMap(Query.java:1367)
    	at org.datanucleus.jpa.JPAQuery.getResultList(JPAQuery.java:153)
    	... 32 more

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut
    Ce qui est étonnant c'est que cette méthode me retourne un résultat sans erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Integer getNbOfUsersByFirstName(String firstName){
    		EntityManager em = EMF.get().createEntityManager();
    		try {
    			Query query = em.createQuery("SELECT count(id) FROM " + Person.class.getName() + " WHERE firstName = :firstName");
    			query.setParameter("firstName", firstName);
    			return (Integer)query.getSingleResult();
    	    } finally {
    	        em.close();
    	    }
    	}

  7. #7
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Tout est dit dans ton exception :
    org.datanucleus.exceptions.ClassNotResolvedException: Person
    Ta classe Person est bien dans le classpath de ton serveur ?

    Il ne trouve pas ta classe Person ou bien elle a des erreurs.
    Ce n'est pas un pb gwt dans la mesure où tu appelles bien ce code dans ta partie serveur.

  8. #8
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut
    La chose étrange c'est que cette requete fonctionne :

    "SELECT count(id) FROM " + Person.class.getName() + " WHERE firstName = :firstName"

    et pas celle-là :

    "SELECT p FROM " + Person.class.getName() + " p";

  9. #9
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    La différence entre les deux requêtes, c'est que celle qui fonctionne n'a pas besoin de créer d'objet Person.

    Si la première ne fait pas d'erreur à la compilation, c'est que la classe Person est bien dans le classpath (a priori).

    Peux tu, côté de serveur, essayer en dehors de JPA d'instancier un objet Person pour voir s'il n'y aurait pas de problème à l'instanciation.

    Ce qui me laisse perplexe, c'est que dans la doc de DataNucleus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    A ClassNotResolvedException is thrown if an attempt is made to load a class that is cannot be found by the ClassLoaderResolver.
    Si tu fesais du JDO, je te dirai de vérifier si ta classe Person est bien "enhanced" mais avec JPA, je crois (je n'en suis pas sûr) que ce n'est pas nécessaire.

  10. #10
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut
    L'instanciation ne pose pas de problème (voir si dessous)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public Boolean login(String login, String password){
     
    	Person user = new Person(login,"",null); 
    	BoUser boUser = new BoUser();
    	boUser.saveUser(user);
     
    	Integer nb = boUser.getNbOfUsersByFirstName(login);
     
    	List<Person> allUsers = boUser.getAllUsers();
     
    	return true;
    }
    Peut-être y a-t-il un soucis dans les annotations de la classe Person :

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    package com.picon.arnotjevleesch.server.data;
     
    import java.util.Date;
     
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
     
    @Entity
    public class Person {
     
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
     
        private String firstName;
     
        private String lastName;
     
        private Date hireDate;   
     
        // Accessors for the fields.  JPA doesn't use these, but your application does.
     
        public Person(String firstName, String lastName, Date hireDate) {
    		super();
    		this.firstName = firstName;
    		this.lastName = lastName;
    		this.hireDate = hireDate;
    	}
     
    	public Long getId() {
            return id;
        }
        public void setId(Long id) {
            this.id = id;
        }
     
        public String getFirstName() {
            return firstName;
        } 
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        } 
     
        public String getLastName() {
            return lastName;
        } 
        public void setLastName(String lastName) {
            this.lastName = lastName;
        } 
     
        public Date getHireDate() {
            return hireDate;
        } 
        public void setHireDate(Date hireDate) {
            this.hireDate = hireDate;
        }
    }

  11. #11
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Par défaut
    Je pense à un truc en voyant ton code :

    Ajoute le constructeur par défaut Person() qui a été annulé dès lors que tu as mis un constructeur paramétré.
    Et réessaye ...

  12. #12
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut
    J'ai toujours le même problème, je laisse le constructeur par défaut c'était une bonne idée, ça n'aurait pas été la première fois que le constructeur par défaut fasse %*$^ù !

  13. #13
    Membre confirmé
    Inscrit en
    Juillet 2005
    Messages
    95
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 95
    Par défaut
    J'ai enfin résolu le pb, il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List l = query.getResultList();
    return l;
    au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    return query.getResultList();
    Hum, hum...

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

Discussions similaires

  1. select tout simple
    Par arnobidul dans le forum GWT et Vaadin
    Réponses: 8
    Dernier message: 25/05/2009, 14h16
  2. un select tout simple
    Par cladsam dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/10/2007, 14h53
  3. [debutant] Frame tout simple ?
    Par Invité dans le forum JBuilder
    Réponses: 1
    Dernier message: 05/07/2005, 16h00
  4. un algo tout simple de randomisation (enfin, j'espere)
    Par orichimaru dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 30/11/2004, 22h15
  5. [langage] Problème tout simple
    Par marouanitos dans le forum Langage
    Réponses: 5
    Dernier message: 24/09/2003, 11h25

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