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

Hibernate Java Discussion :

Query avec sélection des éléments de deux classes composites


Sujet :

Hibernate Java

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut Query avec sélection des éléments de deux classes composites
    Bonjour,

    J'utilise Hibernate 3 et j'ai un problème de requête.

    Avec les classes suivantes
    classe Vehicule: idVehicule, numOrdre, ...

    classe Consommation: id, dateConsommation, codeConsommation, vehicule(type Vehicule), quantite, ...
    J'ai testé la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = session.createQuery("SELECT dateConsommation, codeConsommation, quantite FROM Consommation");
    et ça fonctionne.

    Mais quand je cherche à récupérer les informations de "Vehicule", par exemple "numOrdre", ça ne fonctionne pas.

    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = session.createQuery("SELECT dateConsommation, codeConsommation, Vehicule.getNumOrdre as num, quantite FROM Consommation");
    Quelqu'un saurait-il m'expliquer comment faire ?

    Merci d'avance pour votre aide.

  2. #2
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    Bonjour,

    Hibernate est un ORM, l'intérêt principal étant de travailler directement dans le modèle objet, et non plus en terme de table et colonne comme on pouvait le faire en JDBC.

    La ligne suivante remontera l'ensemble des isntance de votre classe Consommation (et donc l'ensemble de ses attributs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = session.createQuery("FROM Consommation");

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Merci de votre réponse,



    Juste que le contexte m'incite de procéder comme ça, ou peut être je ne sais pas encore la bonne manière de faire puisque je suis encore débutant en intégration d'hibernante avec jasper.


    En suivant cet exemple(https://community.jboss.org/wiki/Usi...sWithHibernate)

    et donc j'ai essayé la proposition
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query query = session.createQuery("FROM Consommation");
    mais j'obtiens une exception

    Exception in thread "main" java.lang.ClassCastException: com.consommation.Consommation cannot be cast to [Ljava.lang.Object;
    at etat.vehicule.HibernateQueryResultDataSource.getFieldValue(HibernateQueryResultDataSource.java:32)
    at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:895)
    net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:624)
    at etat.vehicule.Etat_ListesBonRec.print(Etat_ListesBonRec.java:76)


    --sachant que le fichier jrxml, j'ai mis


    <field name="vehicule" class="com.vehicule.Vehicule"/>


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     public HibernateQueryResultDataSource(List list, String[] fields) { 
        this.fields = fields; 
        this.iterator = list.iterator(); 
      }

    j'ai tenté aussi de construire un tableau d'objets personnalisé,

    mais lorsque j'essaye de mettre un autre constructeur qui accepte un tableau d'objets, je ne peux plus définir l'attribut iterator,


    comme c'est un peu lié à jasper, je ne sais pas c'est le bon endroit de cette question.


    Merci d'avance.

  4. #4
    Membre habitué Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Points : 139
    Points
    139
    Par défaut
    Désolé je n'ai jamais utilisé Hibernate dans Jasper...
    Par contre au vue de l'erreur, il semblerait que vous cherchiez à récupérer une collection d'intances d'Object, plutot qu'une collection d'instances de Consommation. Pouvez vous nous indiquer le code qui suit la requête HQL pour voir comment vous l'exploitez ?

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Je vous remercie pour votre aide,



    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
     
    Query query = session.createQuery("FROM Consommation");
     
    List bons = query.list();
     
    JasperDesign jasperDesign = JRXmlLoader.load("src/reportConsommation.xml");
    	JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
     
    String[] fields = new String[] {"dateConsommation", "codeConsommation", "ancienIndex", "nouvelIndex", "typeConsommation", "quantite"};
    HibernateQueryResultDataSource ds = new HibernateQueryResultDataSource(bons, fields);
     
     
    Map parameters = new HashMap();
    	parameters.put("paramId", 1);
     
    	JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
    			parameters, ds);
    	JasperViewer.viewReport(jasperPrint);

    et le code de la classe HibernateQueryResultDataSource

    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
     
     
    public class HibernateQueryResultDataSource implements JRDataSource { 
     
    	  private String[] fields; 
    	  private Iterator iterator; 
    	  private Object currentValue; 
     
     
    	  public HibernateQueryResultDataSource(List list, String[] fields) { 
    	    this.fields = fields; 
    	    this.iterator = list.iterator(); 
    	  } 
     
    	  /*public HibernateQueryResultDataSource(Object[][] list, String[] fields) { 
    		    this.fields = fields;
     
    		    //this.iterator = list.iterator(); 
    		  }  */
     
    	  public Object getFieldValue(JRField field) throws JRException { 
    		    Object value = null; 
    		    int index = getFieldIndex(field.getName()); 
    		    if (index > -1) { 
    		      Object[] values = (Object[])currentValue; 
    		      value = values[index]; 
    		    } 
    		    return value; 
    		  } 
     
    	  public boolean next() throws JRException { 
    	    currentValue = iterator.hasNext() ? iterator.next() : null; 
    	    return (currentValue != null); 
    	  } 
     
    	  private int getFieldIndex(String field) { 
    	    int index = -1; 
    	    for (int i = 0; i < fields.length; i++) { 
    	      if (fields[i].equals(field)) { 
    	        index = i; 
    	        break; 
    	      } 
    	    } 
    	    return index; 
    	  }	 
    	}



    Merci.

Discussions similaires

  1. Zone de liste déroulante avec regroupement des éléments
    Par Lincoln911 dans le forum VBA Access
    Réponses: 1
    Dernier message: 26/04/2010, 12h55
  2. Réponses: 1
    Dernier message: 15/03/2010, 21h32
  3. accéder a des élément d'un classe partagé en deux (partial)
    Par TaymouWan dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/04/2009, 11h58
  4. Permutez des éléments entre deux zones deux listes
    Par dricks dans le forum VBA Access
    Réponses: 2
    Dernier message: 14/09/2007, 09h56
  5. Batch d'extraction avec sélection des données ?
    Par beastman007 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2006, 11h02

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