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 :

[JPA] problème récupération de données


Sujet :

JPA Java

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut [JPA] problème récupération de données
    Bonjour !

    Dans le cadre d'un projet manipulant des EJB, je rencontre un petit souci au niveau de la récupération de données avec JPA :

    J'ai tout d'abord un EJB Entity :

    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
     
    @Entity
    @Table(name = "Utilisateur")
    public class Utilisateur implements Serializable {
        private static final long serialVersionUID = 1L;
     
        @Id
        private String login;
        @Column
        private String pass;
        @Column
        private String nom;
        @Column
        private String prenom;
        @Column
        private String dateDeNaissance;
     
        @OneToMany
        private List<Utilisateur> amis = new ArrayList<Utilisateur>();
     
        ...
       }
    J'ai ensuite un EJB session stateful :

    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
     
     
    @Stateful
    public class UtilisateurEJB implements UtilisateurEJBLocal {
        @PersistenceContext(name = "AnnuaireEJB-ejbPU")
        private EntityManager em;
     
        ...
     
        @Override
        public List<Utilisateur> findUtilisateurByNameAndFName(String name, String fname)
        {
            Query q = em.createQuery("SELECT u.nom, u.prenom FROM Utilisateur u WHERE u.nom = ? and u.prenom = ? ").setParameter(1,fname).setParameter(2, name);
            return q.getResultList();
        }
     
        ...
    }
    Je n'ai mis que la fonction findUtilisateurByNameAndFName qui est celle qui pose problème.

    Voilà tout pour mon conteneur EJB.

    Maintenant dans mon conteneur web j'ai :

    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
     
     
    @ManagedBean(name="connexionBean")
    @SessionScoped
    public class UtilisateurJSFBean implements Serializable{
     
        /**
            * Creates a new instance of UtilisateurJSFBean
            */
        public UtilisateurJSFBean() {
        }
     
        @EJB
        private UtilisateurEJBLocal utilisateurEJB;
     
        ...
     
        public String researchForm()
        {
            resultRecherche = "resultat : ";
     
            List<Utilisateur> res = new ArrayList<Utilisateur>();
            res = utilisateurEJB.findUtilisateurByNameAndFName(recherchePrenom, rechercheNom);
     
     
            for(int i=0;i<res.size();i++)
            {
                resultRecherche+=((res.get(i))).getNom();
            }
     
     
            resultRecherche+=res.get(0).getNom();
     
            rechercheNom="";
            recherchePrenom="";
     
            return "success";
        }
    Lors de l'execution de cette fonction (donc quand je valide le formulaire de recherche), j'ai une erreur que je ne parviens à corriger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        An Error Occurred:
     
    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to DAO.Utilisateur
    Et dans la stacktrace :

    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
     
     
        javax.faces.el.EvaluationException: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to DAO.Utilisateur
    	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
    	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
    	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
    	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
    	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
    	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
    	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
    	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
    	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
    	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
    	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
    	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
    	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
    	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
    	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
    	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
    	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
    	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
    	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
    	at java.lang.Thread.run(Thread.java:722)
    Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to DAO.Utilisateur
    	at Controller.UtilisateurJSFBean.researchForm(UtilisateurJSFBean.java:234)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:601)
    	at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:779)
    	at javax.el.BeanELResolver.invoke(BeanELResolver.java:528)
    	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257)
    	at com.sun.el.parser.AstValue.invoke(AstValue.java:248)
    	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
    	at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:39)
    	at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
    	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
    	... 32 more
    Je ne parviens pas à résoudre le problème.

    Désolé par avance pour la longueur du message, mais c'était pour exposer le contexte le mieux possible.

    Merci d'avance pour l'aide que vous voudrez bien m'apporter ...

    Cordialement,

    Muska17

    PS: je tiens à préciser que si je n'accède pas au contenu de resultRecherche avec la boucle, par exemple, mais que je fais un resultRecherche.size() à la place, la valeur est supérieure à 0.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ta query dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        @Override
        public List<Utilisateur> findUtilisateurByNameAndFName(String name, String fname)
        {
            Query q = em.createQuery("SELECT u.nom, u.prenom FROM Utilisateur u WHERE u.nom = ? and u.prenom = ? ").setParameter(1,fname).setParameter(2, name);
            return q.getResultList();
        }
    ne retourne pas des utilisateurs, mais uniquement des noms et des prénoms. Du coup, tu obtiens une List<Object[]> avec chaque tableau contenant le nom et le prénom. Si tu veux retourner des utilisateurs, fait un select sur les utilisateurs, pas sur leurs propriétés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        @Override
        public List<Utilisateur> findUtilisateurByNameAndFName(String name, String fname)
        {
            Query q = em.createQuery("SELECT u FROM Utilisateur u WHERE u.nom = ? and u.prenom = ? ").setParameter(1,fname).setParameter(2, name);
            return q.getResultList();
        }

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut
    Bonjour tchize !

    Merci beaucoup grâce à toi ça marche parfaitement.

    Cordialement,

    Muska17

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

Discussions similaires

  1. problème récupération de données en liaison série
    Par prison_break dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/06/2007, 09h51
  2. [VB6] Problème récupération de données
    Par valie dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 29/08/2006, 13h36
  3. problème récupération de données dans des fichiers .DAT
    Par indymontpellier dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/04/2006, 08h54
  4. [MySQL] Problème récupération de données avec un SELECT DISTINCT
    Par 12_darte_12 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/07/2005, 15h48
  5. [Débutant] Problème récupération de données
    Par flogreg dans le forum Servlets/JSP
    Réponses: 26
    Dernier message: 20/08/2004, 18h29

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