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

Développement Web en Java Discussion :

Récupération données à partir de 3 tables différentes


Sujet :

Développement Web en Java

  1. #1
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut Récupération données à partir de 3 tables différentes
    Salut
    je suis entrain de faire une application JEE, avec les couches: dao, servlet, service et modèle.
    J'ai 3 classes et correspondent à 3 tables dans la base de données:
    la classe "Risque", la classe "danger", et la classe "engendrer" qui contient l'association
    danger (0,n) ->(0,n) Risque, càd l'identifiant du risque et l'identifiant du danger.
    Mon problème c'est que j'ai besoin de récupérer les risques associés à un danger spécifique, j'ai pensé a faire ces étapes mais puis je me suis plantée:
    1- faire une requête qui sélectionne dans la table engendrer les 'id_risque correspondant à l'id_danger
    2-retourner la liste des id_risque et afficher ensuite à partir de la classe risque les informations sur chacun des risques engendré pas ce danger.
    Comment faire au niveau de la couche DAO?
    j'ai commencé par ce bout de code puis je n'ai pas su comment faire.
    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
     
    package DAO;
     
    import org.hibernate.Query;
    import org.hibernate.Session;
     
    import util.HibernateUtil;
    import modele.Engendrer;
    import modele.Risque;
     
    public class DangerDAOHibernate implements DangerDAO {
    	public Risque findDangerRisques(int id){
    		Session s = HibernateUtil.getSession();
     
    		Query q = s.createQuery(
    				"from engendrer s where s.id_danger= :id_danger").setInteger(
    				"id_danger", id);
     
    		Engendrer pers = (Engendrer) q.uniqueResult();
    		Query p = s.createQuery("from risque risq where risq.id_risq");
     
    		s.close();
    	}
    }
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Query q = s.createQuery(
    				"select r from engendrer s, risque r where s.id_danger= :id_danger and s.id_risque = r.id").setInteger(
    				"id_danger", id);
     
    		List<Risque> resultat (List<Risque>) q.list();
    A noter que, normalement, engender ne devrais pas avoir de id_danger, mais directement un danger, le mapping hibernate, c'est du mapping objet, donc t'as peut-être quelque chose à corriger par là.

  3. #3
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Query q = s.createQuery(
    				"select r from engendrer s, risque r where s.id_danger= :id_danger and s.id_risque = r.id").setInteger(
    				"id_danger", id);
     
    		List<Risque> resultat (List<Risque>) q.list();
    A noter que, normalement, engender ne devrais pas avoir de id_danger, mais directement un danger, le mapping hibernate, c'est du mapping objet, donc t'as peut-être quelque chose à corriger par là.
    Merci, mais je n'ai pas bien compris votre remarque concernant id_danger. pouvez vous mieux m'éclaircir? qu'est ce que ça veut dire directement un danger?
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  4. #4
    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 classe engender devrais ressembler à ça


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Engender {
       private Danger danger;
       private Risque risque;
       // + getters , setter et données additionnelles
    }
    et non à ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Engender {
       private Integer id_danger;
       private Integer id_risque;
       // + getters , setter et données additionnelles
    }
    Afin qu'hibernate puisse gérer correctement la double relation OneToMany

  5. #5
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    Le problème, c'est que cette table s'est créé automatiquement à partir du modèle physique des données en power AMC, et donc dans la base de données cette table contient id_danger et id_risque. Je ne sais pas si c'est correcte ou pas et moi je n'ai fais que mettre les mêmes attribut dans la classe modèle.
    Images attachées Images attachées   
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  6. #6
    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
    Citation Envoyé par janyoura Voir le message
    dans la base de données cette table contient id_danger et id_risque.
    Oui, mais au niveau d'hibernate / JPA, ce ne sont pas les tables, mais les objet que tu manipule. Un id dans une table qui fait référence à une autre table, au niveau objet, c'est un objet qui fait référence à un autre objet.

  7. #7
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    J'ai fais la requete comme ci-dessous, mais j'ai une erreur lors du teste du code.
    services:
    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
    public class DangerServices {
     
    	private DangerDAO dDAO = new DangerDAOHibernate();
     
    	public Danger checkDangerNom(String nom) throws RechercheExceptions {
    		Danger f = dDAO.findByNom(nom);
    		// Si le titre correspond à une Formation, on vérifie le titre associé
    		if (f != null)
     
    			if (f.getnom().equals(nom))
    				return f;
     
    			else
    				throw new RechercheExceptions(
    						"Aucun résultat correspondant au titre");
    		else
    			throw new RechercheExceptions("Aucune formation disponible");
     
    	}
     
    	public List getRisqueD(int id) {
    		List l1 = dDAO.findDangerRisques(id);
    		return l1;
    	}
     
    }
    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
    public class DangerDAOHibernate implements DangerDAO {
    	public List findDangerRisques(int id) {
    		Session s = HibernateUtil.getSession();
     
    		List list = s
    				.createQuery(
    						"from Engendrer s, Risque risq where s.id_danger= :id_danger and s.id_risq = risq.id_risq")
    				.setInteger("id_danger", id).list();
     
    		/*
    		 * Engendrer pers = (Engendrer) q.uniqueResult(); =
    		 * s.createQuery("from risque risq where risq.id_risq = :id_risq"
    		 * ).list();
    		 */
     
    		s.close();
    		return list;
    	}
    jsp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <%Integer id_danger = (Integer) request.getAttribute("id_danger");
     
     
    DangerServices DServ = new DangerServices();
    List listRisque = DServ.getRisqueD(id_danger);
     
     for(int i=0;i<listRisque.size();i++)
     {
    	 Risque c1 = (Risque) listRisque.get(i);
     out.print("<tr class='second'><td class='text' style='width: 10%;'><div class=''>"+c1.getId_ris()+"</div></td><td class='text' style='width: 10%;'><div class=''>"+c1.getNom()+"</div></td><td class='text' style='width: 10%;'><div class=''>"+c1.getType()+"</div></td><td class='text' style='width: 10%;'><div class=''>"+c1.getGravite()+"</div></td><td class='text' style='width: 10%;'><div class=''>"+c1.getProbabilite()+"</div></td><td class='text' style='width: 10%;'><div class=''>"+c1.getConseq()+"</div></tr>");
    }
    %>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    juil. 31, 2013 4:52:03 AM org.apache.catalina.core.ApplicationDispatcher invoke
    Grave: "Servlet.service()" pour la servlet jsp a lancé une exception
    org.hibernate.QueryException: could not resolve property: id_danger of: modele.Engendrer [from modele.Engendrer s, modele.Risque risq where s.id_danger= :id_danger and s.id_risq = risq.id_risq]
    	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:67)
    	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:61)
    	at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1375)
    	at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:304)
    	at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:410)
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

  8. #8
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    il te dit qu´il n´arrive pas a retrouver la propiété "id_danger" de Engendrer.
    verifie ta Table Engendrer s´il a un champ ou dans ton model de classe nommer : id_danger.
    Eric

  9. #9
    Membre actif Avatar de janyoura
    Femme Profil pro
    étudiante ingénierie informatique
    Inscrit en
    Mars 2012
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : étudiante ingénierie informatique

    Informations forums :
    Inscription : Mars 2012
    Messages : 365
    Points : 279
    Points
    279
    Par défaut
    Citation Envoyé par jeffray03 Voir le message
    il te dit qu´il n´arrive pas a retrouver la propiété "id_danger" de Engendrer.
    verifie ta Table Engendrer s´il a un champ ou dans ton model de classe nommer : id_danger.
    Eric
    C'est bon j'ai trouvé le problème
    "Scientists dream about doing great things. Engineers do them.”

    La réussite après tant de travail est un sentiment à vivre

    Si ton message est résolu, il y a un bouton qui est fait pour ça :
    Il se trouve tout en bas de la conversation !

    N'oublie pas que si ce message t'as aidé, tu peux voter pour lui en utilisant

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/04/2009, 12h46
  2. [AC-2003] Champs calculé à partir de 2 tables différentes
    Par p0ulpy dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/04/2009, 14h17
  3. [MySQL] Filtrer des données venant de 2 tables différentes
    Par Shinoda00 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 05/03/2009, 21h05
  4. Réponses: 1
    Dernier message: 20/02/2008, 11h34
  5. Réponses: 8
    Dernier message: 14/02/2008, 18h04

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