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 :

[NativeQuery] Recuperation des valeur d'une requete


Sujet :

JPA Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut [NativeQuery] Recuperation des valeur d'une requete
    Bonjour,

    Dans mon projet, j'utilise les EJB3, cependant, j'ai été amené a faire une requête avec du code SQL sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    query = entityManager
                    .createNativeQuery("SELECT p.id_personne_parcours, "
                        + "m.date_et_heure "
                        + "FROM t_elo_parcours p, T_DISPO m, "
                        + "T_ETAP e "
                        + "WHERE p.id_parcours IN "
                        + "(SELECT a.id_parcours FROM t_elo_etapes a, "
                        + "(SELECT id_parcours, max(date_et_heure_creation) "
                        + "as date_et_heure_creation FROM t_elo_etapes GROUP BY id_parcours) b "
                        + "WHERE a.id_parcours = b.id_parcours AND a.date_et_heure = b.date_et_heure "
                        + "AND a.id_type_etape != 33) AND p.id_parcours = e.id_parcours AND m.id_etape = e.id_etape");
     
    retour = (List<SyntheseValeur>) query.getResultList();
    avec :

    List<SyntheseValeur> retour = new ArrayList<SyntheseValeur>();
    et la classe SyntheseValeur qui a deux attribut dans sa déclaration de classe :

    long id;
    Date date;
    Avec bien sur les setters et les getters qui vont avec.

    Cependant, lorsque j'essaie d'obtenir les valeurs de la liste retour, je n'obtiens rien du tout a part un classCastException.
    Comment puis je faire pour récupérer les valeur de ma requête afin de les insérer dans la liste (retour).

    Merci.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    L'erreur ClassCastException est normale, tu dois récupérer un tableau d'Object.
    Dans ton cas, il faudrait utiliser la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query query = entityManager.createNativeQuery("select ...", SyntheseValeur.class);
    A+

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    L'erreur ClassCastException est normale, tu dois récupérer un tableau d'Object.
    Dans ton cas, il faudrait utiliser la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query query = entityManager.createNativeQuery("select ...", SyntheseValeur.class);
    A+
    En effet par la suite j'ai utilisé cette commande, mais cela n'a pas fonctionner. Dois je rajouter un élément supplémentaire ou dois je faire quelque chose de particulier par rapport a la classe SyntheseValeur ?

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Quelle était l'erreur ? Tu as un stacktrace à montrer ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Quelle était l'erreur ? Tu as un stacktrace à montrer ?
    L'erreur que j'obtiens est celle ci :

    org.hibernate.MappingException: Unknown entity: com.transverse.ov.RpaElementListeSyntheseValeur

  6. #6
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par top_eagle Voir le message
    L'erreur que j'obtiens est celle ci :

    org.hibernate.MappingException: Unknown entity: com.transverse.ov.RpaElementListeSyntheseValeur
    Quel rapport entre SyntheseValeur et RpaElementListeSynthese ?
    Peux-tu montrer le mapping ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Quel rapport entre SyntheseValeur et RpaElementListeSynthese ?
    Peux-tu montrer le mapping ?


    Désolé en effet c'était plutôt :

    org.hibernate.MappingException: Unknown entity: com.transverse.ov.SyntheseValeur
    C'était une erreur de ma part

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Peux-tu montrer le code de cette classe ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Peux-tu montrer le code de cette classe ?
    Voici le code de la classe en question :

    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
    public class SyntheseValeur implements Serializable
    {
     
        private long id;
     
        private Date date;
     
        public SyntheseValeur()
        {
            super();
        }
     
        /**
         * @return the id
         */
        public final long getId()
        {
            return id;
        }
     
        /**
         * @param id the id to set
         */
        public final void setId(long id)
        {
            this.id = id;
        }
     
        /**
         * @return the date
         */
        public final Date getDate()
        {
            return date;
        }
     
        /**
         * @param date the date to set
         */
        public final void setDate(Date date)
        {
            this.date = date;
        }
     
    }

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tu as bien mis l'annotation @Entity ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Tu as bien mis l'annotation @Entity ?
    Non, car ce n'est pas une classe qui est référencé en base

  12. #12
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Alors je ne crois pas que ce soit possible autrement qu'en constituant toi même la liste d'objets SyntheseValeur à partir du résultat de la requête native.
    Tous les exemples que j'ai vu partent d'entity...

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    Alors je ne crois pas que ce soit possible autrement qu'en constituant toi même la liste d'objets SyntheseValeur à partir du résultat de la requête native.
    Tous les exemples que j'ai vu partent d'entity...
    J'ai vu un exemple qui utilise l'annotation suivante pour une classe :

    @SqlResultSetMapping

    Sais tu si la classe en question doit obligatoirement être une entity ?

  14. #14
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    D'après ce que j'ai vu de la doc, oui...
    Mais rien n'empêche de faire un test.
    Avec Hibernate "natif", on peut le faire, je ne sais pas par contre si JPA l'a prévu...
    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SQLQuery query = getHibernateSession().createSQLQuery("select utilisateurUid, sum(PrixVente) as clientPrix, sum(PrixAchat) as prixHt, sum(PrixVente-PrixAchat) as marge from ordretransport where chargementDate between ? and ? group by utilisateurUid");
    query.addScalar("utilisateurUid", Hibernate.STRING);
    query.addScalar("clientPrix", Hibernate.DOUBLE);
    query.addScalar("prixHt", Hibernate.DOUBLE);
    query.addScalar("marge", Hibernate.DOUBLE);
    query.setResultTransformer(Transformers.aliasToBean(StatistiqueOrdreTransport.class));
    query.setDate(0, dateFrom);
    query.setDate(1, dateTo);
    list = query.list();
    avec la classe StatistiqueOrdreTransport
    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
    61
    62
    63
    64
    65
     
    package com.obia.safe.struts.ordretransport;
     
    public class StatistiqueOrdreTransport
    {
        private String utilisateurUid;
        private double clientPrix = 0;
        private double prixHt = 0;
        private double marge = 0;
     
        public StatistiqueOrdreTransport()
        {
            super();
        }
     
        public StatistiqueOrdreTransport(String utilisateurUid, double clientPrix, double prixHt, double marge)
        {
            super();
            this.utilisateurUid = utilisateurUid;
            this.clientPrix = clientPrix;
            this.prixHt = prixHt;
            this.marge = marge;
        }
     
        public String getUtilisateurUid()
        {
            return utilisateurUid;
        }
     
        public void setUtilisateurUid(String utilisateurUid)
        {
            this.utilisateurUid = utilisateurUid;
        }
     
        public double getClientPrix()
        {
            return clientPrix;
        }
     
        public void setClientPrix(double clientPrix)
        {
            this.clientPrix = clientPrix;
        }
     
        public double getPrixHt()
        {
            return prixHt;
        }
     
        public void setPrixHt(double prixHt)
        {
            this.prixHt = prixHt;
        }
     
        public double getMarge()
        {
            return marge;
        }
     
        public void setMarge(double marge)
        {
            this.marge = marge;
        }
     
    }
    (à noter que c'est le constructeur sans argument qui est utilisé, l'autre étant là pour autre chose...)

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    J'ai fini par trouver une solution de contournement :

    1) J'utilise uniquement la methode createNativeQuery(String)
    2) Pour la réception des résultats, je procède de la sorte :

    List<Object[]> resultat = query.getResultList();

    3) Par la suite je parcours le résultat :

    if (resultat != null)
    for (Object[] valeur : resultat)
    {
    ........
    }

    Et a la fin j'ai toute mes valeurs en trantypant dans le bon type.

    Merci encore de ton aide, c'était super sympa de ta part.

  16. #16
    Membre averti

    Profil pro
    Inscrit en
    Février 2009
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 284
    Points : 409
    Points
    409
    Par défaut
    J'ai eu le même genre de soucis que j'ai résolu en annotant une classe qui caste le resultat de la requette

    la classe doit en effet etre annotée avec
    @entity
    public classe MaClasse {

    et avoir une @Id non nulle!

    on définit le mapping avec

    @SqlResultSetMapping(name="mapping", @EntityResult(entityClass=MaClasse.class,
    fields = {
    @FieldResult(name="id", column="id"), ...

    on définit la requette par

    @NamedNativeQuery(query="...",
    resultSetMapping="mapping")

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 154
    Points : 72
    Points
    72
    Par défaut
    Oui je voulais également essayé cette solution, mais je crois qu'il faut insérer une nouvelle table dans la base, celle qui doit contenir le résultat si je ne me trompe ?

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 14/02/2011, 00h53
  2. [MySQL] Perte de la liste des valeurs d'une requete sql
    Par yaya_la_rafale dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 19/04/2010, 14h30
  3. Recuperation des valeur d'une ligne-DetailView
    Par usermap dans le forum Débuter
    Réponses: 0
    Dernier message: 30/03/2009, 16h43
  4. [DAO][00]Envoyer des valeurs dans une requete SQL direct
    Par Jeannot2 dans le forum VBA Access
    Réponses: 5
    Dernier message: 17/04/2007, 10h18
  5. recupere des données d'une requete
    Par torNAdE dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/07/2006, 10h38

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