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

avec Java Discussion :

parcourir une List avec différents objets


Sujet :

avec Java

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut parcourir une List avec différents objets
    Bonjour,

    j'ai une liste dans laquelle je récupère le résultats d'u query suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Query query = connection.CreateNativeQuery("select A_Name,B_Name,B_Type From A inner join B on A.A_Name=B.B_Name");//par exemple.
    List<Object> result = query.getResultList();
     
    Object[] object = new Object[result.size()];
             int i=0;
            for (Iterator<Object> it = result.iterator(); it.hasNext();) {
                object[i]= it.next();
                JOptionPane.showMessageDialog(null,object[i]);
                i++;
    J'ai un souci concernant le parcourt de la liste:
    Je veux récupérer chaque élément séparément pour pouvoir les intégrer dans mon Jtable. J'arrive à récupérer une ligne(enregistrement) entière (A_Name_ligne1,B_Name_ligne1,B_Type_ligne1) mais je n'arrive pas à récupérer juste A_Name_Ligne1. Comment parcourir la liste de manière à accéder à chaque élément d'un enregistrement?

    Merci d'avance pour votre aide.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Points : 136
    Points
    136
    Par défaut
    Salut,

    Tu peux parcourir ta List de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (Object o : result) {
       ...
    }
    Si tu as vraiment besoin d'extraire un tableau de la List tu peux utiliser la méthode toArray
    "Je sais que je suis un geek depuis que j'utilise le timer de mIRC pour faire cuire des pâtes"

  3. #3
    Membre régulier Avatar de DjGonk
    Profil pro
    Inscrit en
    Février 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 88
    Points : 98
    Points
    98
    Par défaut
    Salut,

    En fait ce qu'il te manque c'est le type d'objet retourné. Il faut que tu crées un bean qui représente un tuple du ResultSet.

    Ex :
    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
     
    public class Resultat{
     
        private Object nameA;
        private Object nameB;
        private Object type;
     
       public Resultat(){
       }
     
       public Resultat(Object nameA, Object nameB, Object type){
          ......
       }
     
       // Avec les getters et setters des 3 variables (nameA, nameB et type).
    }
    ensuite tu le passes à ta requête :

    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
     
    Query query = connection.CreateNativeQuery("select A_Name,B_Name,B_Type From A inner join B on A.A_Name=B.B_Name", Resultat.class);//par exemple.
    //recupération
    List<Resultat> result = query.getResultList();
    //parse
    Iterator<Resultat> it = result.iterator();
     
    while(it.hasNext()){
        //Une ligne 
        Resultat r = it.next();
        //Print exemple
        JOptionPane.showMessageDialog(null,r.getNameA());
     
        ....
     
     
    }

  4. #4
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut à tous et merci pour vos réponses,

    J'ai testé ta réponse DjGonk mais ça ne marche pas. ça bloque dans la ligne
    Resultat r = it.next();
    En fait, j'ai déjà les classes correspondantes aux éléments renvoyés par la requête. C'est justement le fait que chaque élément (en relationnel) correspond à un objet( en OO). C'est pour ça, je définis la liste comme en étant une liste d'object. Mon idée était d'accéder à chaque élément (A_Name, B_Name), caster l'objet(l'élément) et puis utiliser get_A_Name et get_B_Name. le problème c'est que, comme la requête renvoie des éléments de différents types (classes) je ne peux pas caster, la seule solution à mon avis est de récupérer élément par élément et caster par la suite.

    C'est là que je trouve que la solution de BigBear 19 intéreréssante, mais j'avoue que je n'arrive pas à utiliser toArray. pourrais-tu m'explique stp comment je peux l'utiliser dans mon cas? dans ta réponse, tu dis qu'il faut faire for(Object obj : result) mais en faisant ça, j'ai pour obj[1] = A_Name|B_Name|B_Type ect.

    une idée?

    Merci à vous.

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2009
    Messages : 112
    Points : 136
    Points
    136
    Par défaut
    Ma solution ne permettait que de simplifier le parcours de la liste tel que tu le fais dans ton premier post. Mais elle ne résout pas ton problème en fait (dsl je ne l'avais pas lu suffisamment en détail).

    Il me semble que la solution de DjGonk devrait fonctionner, mais il faut peut être que tu modifies ta requête pour préciser quel bean tu souhaites récupérer. Mais bon, je ne suis pas un expert en BDD...
    Ce lien te sera peut être utile

    PS: pour la méthode toArray il sufit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object[] object = result.toArray();
    "Je sais que je suis un geek depuis que j'utilise le timer de mIRC pour faire cuire des pâtes"

  6. #6
    Membre régulier Avatar de DjGonk
    Profil pro
    Inscrit en
    Février 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 88
    Points : 98
    Points
    98
    Par défaut
    Je suis surpris que cela ne fonctionne pas. Car dans la requête je passe le type de bean retourné qui soit dit au passage est quand même plus propre que de caster comme tu le proposes laurentlorient.

    Autrement tu peux faire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    for(Resultat r : query.getResultList()){ //Il faudra peut être caster la liste
         //TODO ton code
    }
    Peux tu nous donner l'erreur que tu as sur it.next() ?

  7. #7
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Salut,

    Voici l'erreur :
    java.lang.ClassCastException: org.eclipse.persistence.internal.helper.NonSynchronizedVector cannot be cast to org.explorer.view.Resultat

    c'est une erreur générée par EclipseLink.

    voici mon code avec la vrai requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Query query = connection.createNativeQuery("select ReportName,RepAttributesName From report inner join reportattributes on reportattributes.ReportID=report.ReportID inner join repattributes_busattributes on reportattributes.RepAttributesID = repattributes_busattributes.RepAttributesID inner join businessattributes on businessattributes.BusAttributesID = repattributes_busattributes.busAttributesID order by ReportName,RepAttributesType");
    List<Resultat> res = query.getResultList();
    Iterator<Resultat> it;
            Object object = new Object();
            int i = 0;
            for (it = res.iterator(); it.hasNext(); ) {
                object = it.next();
               // Resultat r=it.next()//génére l'erreur en rouge.
                JOptionPane.showMessageDialog(null, object);
                i++;
            }
    quand je fais ça le résultat de object est :
    [reportName1 , RepAttributesName1]
    [reportName2 , RepAttributesName2]
    ......
    J'ai pensé à appliquer un split sur chaque object pour récupérer les champs mais ce n'est pas du tout propre.

    Merci à vous

  8. #8
    Membre régulier Avatar de DjGonk
    Profil pro
    Inscrit en
    Février 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 88
    Points : 98
    Points
    98
    Par défaut
    Dans la requête il manque le type class de Resultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Query query = connection.createNativeQuery("select ReportName,RepAttributesName From report inner join reportattributes on reportattributes.ReportID=report.ReportID inner join repattributes_busattributes on reportattributes.RepAttributesID = repattributes_busattributes.RepAttributesID inner join businessattributes on businessattributes.BusAttributesID = repattributes_busattributes.busAttributesID order by ReportName,RepAttributesType", Resultat.class);
    et mettre le cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //recupération
    List<Resultat> result = (List<Resultat>)query.getResultList();
    Attention de bien mettre dans la classe Resultat les getters et setters ainsi que le constructeur en relation avec mes champs retournés par la requete.

  9. #9
    Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    ça bloque toujours dans la 2 eme ligne de ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Resultat> result = (List<Resultat>)query.getResultList();
    ça voudrait dire que la classe Resultat n'est pas bien définie, n'est ce pas?

    Je te mets le code de la classe Resultat:
    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
     
    public class Resultat {
        public Report ReportName;
        public Reportattributes RepAttributesName;
        public Reportattributes RepAttribuesType;
     
        public Resultat() {
        }
     
        public Resultat(Report ReportName, Reportattributes RepAttributesName, Reportattributes RepAttribuesType) {
            this.ReportName = ReportName;
            this.RepAttributesName = RepAttributesName;
            this.RepAttribuesType = RepAttribuesType;
        }
     
        public Reportattributes getRepAttribuesType() {
            return RepAttribuesType;
        }
     
        public void setRepAttribuesType(Reportattributes RepAttribuesType) {
            this.RepAttribuesType = RepAttribuesType;
        }
     
        public Reportattributes getRepAttributesName() {
            return RepAttributesName;
        }
     
        public void setRepAttributesName(Reportattributes RepAttributesName) {
            this.RepAttributesName = RepAttributesName;
        }
     
        public Report getReportName() {
            return ReportName;
        }
     
        public void setReportName(Report ReportName) {
            this.ReportName = ReportName;
        }
     
    }
    C'est la bonne définition?

    Merci.

  10. #10
    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
    Ce code corrigé devrais parler de lui même et répondre à ta question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
            Query query = connection.createNativeQuery("select ReportName,RepAttributesName From report inner join reportattributes on reportattributes.ReportID=report.ReportID inner join repattributes_busattributes on reportattributes.RepAttributesID = repattributes_busattributes.RepAttributesID inner join businessattributes on businessattributes.BusAttributesID = repattributes_busattributes.busAttributesID order by ReportName,RepAttributesType");
            List<Object[]> res = query.getResultList();
            int i = 0;
            for (Iterator<Object[]> it= res.iterator(); it.hasNext(); ) {
                Object[] ligne = it.next();
                JOptionPane.showMessageDialog(null, "La ligne "+i+" vaut: "+ligne);
                JOptionPane.showMessageDialog(null, "ReportName vaut: "+ligne[0]);
                JOptionPane.showMessageDialog(null, "RepAttributesName  vaut: "+ligne[1]);
                i++;
            }
    Car si c'est bien du Hibernate, createNativeQuery.list renvoir toujours une List<Object[]>

  11. #11
    Membre régulier Avatar de DjGonk
    Profil pro
    Inscrit en
    Février 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 88
    Points : 98
    Points
    98
    Par défaut
    Effectivement si c'est hibernate la class Resultat n'est pas forcément une classe persistante. Donc si c'est d'Hibernate qu'il s'agit, la solution tchize_ fonctionne mais n'est pas forcement la plus propre. En effet il est tout de même préférable de manipuler une class qu'un tableau d'obet.

    Le code ci-dessous devrait t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            String requete = "select ReportName as reportName ,RepAttributesName as repAttributs From report  
                                    inner join reportattributes on reportattributes.ReportID=report.ReportID inner join repattributes_busattributes 
                                    on reportattributes.RepAttributesID = repattributes_busattributes.RepAttributesID inner join businessattributes on businessattributes.BusAttributesID = repattributes_busattributes.busAttributesID order by ReportName,RepAttributesType";
     
            List<Resultat> liste = session.createSQLQuery(requete).setResultTransformer(
                    Transformers.aliasToBean(Resultat.class)).list();
    Avec la class Resultat de ce type :

    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
     
    public class Resultat {
     
        public String reportName; //Le as de la requete
        public String repAttributs // L'autre as de la requete
     
        public Resultat() {
        }
     
        public Resultat(String reportName, String repAttributs ) {
            this.reportName = reportName;
            this.repAttributs  = repAttributs ;
        }
     
        public String getRepAttributs() {
            return repAttributs ;
        }
     
        public void setRepAttributs(String repAttributs ) {
            this.repAttributs = repAttributs ;
        }
     
        public String getReportName() {
            return reportName;
        }
     
        public void setReportName(StringreportName) {
            this.reportName= reportName;
        }
    }

Discussions similaires

  1. [2.x] Parcourir une liste d'objets
    Par ELouafi dans le forum Symfony
    Réponses: 2
    Dernier message: 03/09/2012, 00h41
  2. Parcourir une liste d'objets
    Par ELouafi dans le forum Doctrine2
    Réponses: 0
    Dernier message: 01/09/2012, 14h45
  3. [Débutant] Problème pour consommer un service avec une liste ou un objet
    Par scude dans le forum Windows Communication Foundation
    Réponses: 4
    Dernier message: 08/04/2012, 14h17
  4. Réponses: 6
    Dernier message: 14/10/2010, 09h28
  5. Parcourir une liste d'objet ?
    Par Alexino2 dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 18/05/2007, 12h42

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