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 :

[Hibernate] Faire une requête avec relation NN


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut [Hibernate] Faire une requête avec relation NN
    Chaleureux bonjours à tous et à toutes !

    Mon problème concerne une requête que je n'arrive pas à faire passer sous HQL.
    J'ai deux tables t_groupe et t_intervenant avec une relation NN (donc nouvelle table t_correspondance qui contient les id des deux tables).
    Ce que je voudrais faire est l'équivalent de cette requête SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t_i.id_intervenant, t_i.prenom_nom 
    FROM t_intervenant t_i 
    WHERE t_i.id_intervenant IN (
    	SELECT t_c.id_intervenant 
    	FROM t_correspondance t_c, t_groupe t_g 
    	WHERE t_c.id_groupe = t_g.id_groupe 
    	AND t_g.id_domaine = '1')
    (qui passe sans problèmes) avec Hibernate. Mon problème est que je n'arrive pas à utiliser la table t_correspondance car elle n'est pas mapée dans mon fichier de mapping.
    Savez-vous comment faire ?
    (@_@)

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Points : 143
    Points
    143
    Par défaut
    Fée voir ton mapping stp ! Car normalement, dans ton mapping, tu peux la faire apparaître et l'utiliser comme table de jointure. En ajoutant aussi la classe correspondante.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Le voici :
    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
    <class name="tables.T_Groupe" table="t_groupe">
    		<id name="idGroupe" type="integer" column="id_groupe">
    			<generator class="increment" />
    		</id>
    		<property name="libGroupe">
    			<column name="lib_groupe" />
    		</property>
    
    		<property name="id_domaine" />
    		<set name="correspondance" table="t_correspondance">
    			<key column="id_groupe" />
    			<many-to-many column="id_intervenant"
    				class="tables.T_Intervenant" />
    		</set>
    	</class>
    ...
    <class name="tables.T_Intervenant" table="t_intervenant">
    		<id name="idIntervenant" column="id_intervenant" />
    		<property name="libIntervenant">
    			<column name="prenom_nom" />
    		</property>
    
    		<property name="actif">
    			<column name="actif" />
    		</property>
    
    		<property name="application">
    			<column name="application" />
    		</property>
    
    		<set name="correspondance" table="t_correspondance">
    			<key column="id_intervenant" />
    			<many-to-many column="id_groupe" class="tables.T_Groupe" />
    		</set>
    		<set name="ficheS" cascade="all">
    			<key column="id_intervenant" />
    			<one-to-many class="tables.T_Dem_S" />
    		</set>
    		<set name="ficheOS" cascade="all">
    			<key column="id_intervenant" />
    			<one-to-many class="tables.T_Dem_OS" />
    		</set>
    	</class>
    Est-ce que ça suffit ?
    (@_@)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    Points : 143
    Points
    143
    Par défaut
    t_correspondance est pourtant bien mappée dans ton mapping, t'as a même précisé la classe à laquelle elle correspond.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Effectivement, moi non plus je ne vois pas
    Voici, au cas où mon bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SessionFactory sessionFactory = new Configuration().configure()
    				.buildSessionFactory();
    		Session session = sessionFactory.openSession();
     
    		String SQL_QUERY = "SELECT t_i.idIntervenant, t_i.libIntervenant ";
    		SQL_QUERY += "FROM T_Intervenant t_i WHERE t_i.idIntervenant IN ";
    		SQL_QUERY += "(SELECT t_c.id_intervenant FROM T_Correspondance t_c, T_Groupe t_g ";
    		SQL_QUERY += "WHERE t_c.idGroupe = t_g.idGroupe AND t_g.idDomaine = '"
    				+ domaine + "')";
    ...
    L'erreur que je récupère est la suivante :
    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
    javax.servlet.ServletException: T_Correspondance is not mapped. [SELECT t_i.idIntervenant, t_i.libIntervenant FROM tables.T_Intervenant t_i WHERE t_i.idIntervenant IN (SELECT t_c.id_intervenant FROM T_Correspondance t_c, tables.T_Groupe t_g WHERE t_c.idGroupe = t_g.idGroupe AND t_g.idDomaine = '1')]
    	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:743)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	java.lang.reflect.Method.invoke(Method.java:585)
    	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
    	java.security.AccessController.doPrivileged(Native Method)
    	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
    	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
     
     
    root cause 
     
    org.hibernate.hql.ast.QuerySyntaxException: T_Correspondance is not mapped. [SELECT t_i.idIntervenant, t_i.libIntervenant FROM tables.T_Intervenant t_i WHERE t_i.idIntervenant IN (SELECT t_c.id_intervenant FROM T_Correspondance t_c, tables.T_Groupe t_g WHERE t_c.idGroupe = t_g.idGroupe AND t_g.idDomaine = '1')]
    	org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:157)
    	org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)
    	org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)
    	org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:265)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3049)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2938)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.collectionFunctionOrSubselect(HqlSqlBaseWalker.java:4243)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.inRhs(HqlSqlBaseWalker.java:4152)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3835)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1758)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:776)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:577)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
    	org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:218)
    	org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:158)
    	org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:109)
    	org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
     
     
    ...
    (@_@)

  6. #6
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2006
    Messages : 74
    Points : 90
    Points
    90
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT t_c.id_intervenant FROM T_Correspondance
    Le problème vient de là. N'oublie pas que tu es en HQL donc il va chercher une classe qui s'appelle T_Correspondance qu'il ne trouve pas étant donné que tu ne l'as pas défini. Vu que tu utilises une table de jointure, il faut, je pense utiliser des jointures pour pouvoir recupérer des données dans ta table t_correspondance

    En esperant que ça te dépanne.

  7. #7
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Pas forcément, les requetes SQL ne sont pas reformulée en HQL je pense...
    Par contre, il y a surement moyen de faire une requete Criteria pour résoudre ce probleme...

    Ou bien en HQL comme le soulignait drixfkc :
    "WHERE Intervenant int, Groupe grp, Domaine dom WHERE dom.idDomaine = '1'" ... ca pourrait peut-être passer non ?!? (j'ai juste peur du distinct qui ne serait peut etre pas employé en HQL )

    Ou encore en Criteria avec les Example ou bien les createCriteria cumulés.

    J'essaierai de voir cela demain devant un poste ayant hibernate sous la main pour te donner un exemple qui pourrait fonctionner (j'espère).
    See you, space cowboy... and if you're satisfied, click on

  8. #8
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par drixfkc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT t_c.id_intervenant FROM T_Correspondance
    Le problème vient de là. N'oublie pas que tu es en HQL donc il va chercher une classe qui s'appelle T_Correspondance qu'il ne trouve pas étant donné que tu ne l'as pas défini. Vu que tu utilises une table de jointure, il faut, je pense utiliser des jointures pour pouvoir recupérer des données dans ta table t_correspondance

    En esperant que ça te dépanne.

    Désolé de te décevoir, mais j'avais déjà pensé la même chose que toi. Mais ça ne marche toujours pas
    La preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    javax.servlet.ServletException: t_correspondance is not mapped. [SELECT t_i.idIntervenant, t_i.libIntervenant FROM tables.T_Intervenant t_i WHERE t_i.idIntervenant IN (SELECT t_c.id_intervenant FROM t_correspondance t_c, tables.T_Groupe t_g WHERE t_c.idGroupe = t_g.idGroupe AND t_g.idDomaine = '1')]
    	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    (@_@)

  9. #9
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Au fait, pendant que je m'en rappelle :

    Ta relation NN est d'ordre bidirectionnelle ?!? Cad. que tu lies les groupes appartenant à un individu et de l'autre cote les individus appartenant aux groupe ? Si tel est le cas, je pense qu'il te manque un "inverse='true'" dans ton mapping des association (sur le many-to-many) signalant à Hibernate que ces association sont identiques.

    Voila, je vais de ce pas m'attarder sur le probleme des criteria
    See you, space cowboy... and if you're satisfied, click on

  10. #10
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Voici un exemple de requete qui "pourrait" s'appliquer a ton probleme, je ne garantis pas que cela marche mais ca semble, je pense, être en accord avec ce qui est décrit dans la doc Hibernate.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public Set getIntervenantsFromDomaine(int idDomaine){
         Criteria crit = HibernateUtil.currentSession().createCriteria(T_Intervenant.class);
         crit.createCriteria("correspondance")
              .add(Restrictions.eq("id_domaine",new Integer(idDomaine)));
         Set result = new HashSet(crit.list());
         return result;
    }
    Dis moi si ca fonctionne ou non ...
    See you, space cowboy... and if you're satisfied, click on

  11. #11
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Avant de tester bêtement ce bout de code, je voudrais avant le comprendre si ça ne te dérange pas trop...

    Ce que je veux récupérer sont les personnes qui sont dans la table t_intervenant et dont leur groupe fasse partie du domaine 1 (cad : id_domaine=1)
    Pour cela, il faut donc que j'utilise la table t_correspondance, n'est ce pas ?
    Chose que je ne vois pas dans ton bout de code...

    Je ne prétends pas avoir raison ni tort, je veux tout simplement comprendre.
    Peux-tu être un peu plus clair, stp.
    (@_@)

  12. #12
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Pas de souci
    Il suffit de demander.

    L'API Criteria est fournie par Hibernate pour formuler des requetes non pas à partir du modèle de données mais bien sur le modèle objet. Or dans tes objets, aucun ne s'appelle Correspondance, tu n'as que Intervenant et Groupe.
    Analysons si tu le veux bien ce bout de code pour mieux le comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Criteria crit = HibernateUtil.currentSession().createCriteria(Intervenant.class)
    Ici, tu expliques à Hibernate que tu veux créer une requete Criteria qui te renverra un (des) objet(s) de type "Intervenant".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crit.createCriteria("correspondance")
    Dans cette seconde ligne, tu signales à Hibernate que tu veux ajouter, à ce critère de départ une condition (appelée Criterion) de type Criteria qui fait rentrer en jeu un nouvel objet mappé. Cet objet doit être lié à ta première classe via un de ses attributs donc ici l'attribut "correspondance" qui représente la liste des Groupes de ton intervenant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .add(Restrictions.eq("id_domaine",new Integer(idDomaine))
    Enfin, en regardant bien, cette ligne se rattache au second createCriteria et ajoute une restriction à l'objet Groupe ajouté. Cette restriction est : "attribut id_domaine égal à ma variable idDomaine (tu peux mettre 1 si tu préfères)".

    On peut donc traduire la requete globale par : "Je recherche les intervenants ayant un groupe appartenant au domaine ayant pour id : idDomaine". Comme ce que tu souhaites au final.

    En fait, je me suis inspiré de cette section de la documentation Hibernate. En espérant que cela fonctionnera comme on l'entend. Le seul souci est que la documentation elle-même n'explique pas vraiment le résultat de leur requete. j'en ai déduit qu'elle pourrait servir ainsi, mais elle pourrait tout autant ne renvoyer que des intervenants ayant tout leur groupe dans le domaine 1. C'est cependant incertain, je ne peux donc te proposer que de l'essayer, c'est tout
    See you, space cowboy... and if you're satisfied, click on

  13. #13
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Super ! Ca marche nickel et sans problèmes.

    Mils mercis pour ta précieuse aide.
    Bravo à toi BizuR
    (@_@)

  14. #14
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Verifie tout de même que les résultats renvoyés sont les bons
    Mais tant mieux si ca marche, j'aurai également appris encore un peu plus d'Hibernate grâce à toi
    See you, space cowboy... and if you're satisfied, click on

  15. #15
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Les résultats renvoyés sont corrects !
    (@_@)

  16. #16
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Re bonjour !
    je réouvre ce post, car en avançant dans mon développement, je me suis heurté à un problème qui concerne toujours les criteria.
    Ma nouvelle requête est la suivante :
    j'ai 3 tables
    t_domaine : id_domaine (PK)
    lib_domaine

    t_groupe : id_groupe (PK)
    lib_groupe
    id_domaine (FK provenant de t_domaine)

    t_correspondance : id_groupe (FK provenant de t_groupe)
    id_intervenant (FK provenant de t_intervenant)

    Je cherche les domaines qui appartiennent aux groupes dont mon intervenant (passé en paramètre) fait partie.

    En d'autres termes, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t_d.lib_domaine 
    FROM t_domaine t_d, t_groupe t_g 
    WHERE t_d.id_domaine = t_g.id_domaine 
    AND t_g.id_groupe IN (
    	SELECT t_c.id_groupe 
    	FROM t_correspondance t_c 
    	WHERE t_c.id_intervenant = 'nomIntervenant'
    );
    J'ai essayé de chercher de mon côté avec Criteria, mais je n'arrive pas.
    Si qqun pourrait bien m'aider (je ne cherche pas à ce que vous fassiez mon travail à ma place, mais là, je ne sais plus comment faire).
    Merci d'avance de votre aide...
    (@_@)

  17. #17
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Tu peux envoyer ton mapping xml qui va avec histoire de voir les liens de navigations stp ?
    On peut essayer de voir cela ensemble si tu veux, histoire que tu chopes le coup de main
    See you, space cowboy... and if you're satisfied, click on

  18. #18
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Le voilà, chef !
    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
    <class name="tables.T_Domaine" table="t_domaine">
    		<id name="idDomaine" type="integer" column="id_domaine">
    			<generator class="increment" />
    		</id>
    		<property name="libDomaine">
    			<column name="lib_domaine" />
    		</property>
     
    		<set name="idGroupe" cascade="all">
    			<key column="id_groupe" />
    			<one-to-many class="tables.T_Groupe" />
    		</set>
     
    		<set name="idGPCO" cascade="all">
    			<key column="id_gpco" />
    			<one-to-many class="tables.T_GPCO" />
    		</set>
    	</class>
    ...
    <class name="tables.T_Groupe" table="t_groupe">
    		<id name="idGroupe" type="integer" column="id_groupe">
    			<generator class="increment" />
    		</id>
    		<property name="libGroupe">
    			<column name="lib_groupe" />
    		</property>
     
    		<property name="id_domaine" />
    		<set name="correspondance" table="t_correspondance">
    			<key column="id_groupe" />
    			<many-to-many column="id_intervenant"
    				class="tables.T_Intervenant" />
    		</set>
    	</class>
    ...
    <class name="tables.T_Intervenant" table="t_intervenant">
    		<id name="idIntervenant" column="id_intervenant" />
    		<property name="libIntervenant">
    			<column name="prenom_nom" />
    		</property>
     
    		<property name="actif">
    			<column name="actif" />
    		</property>
     
    		<property name="application">
    			<column name="application" />
    		</property>
     
    		<set name="correspondance" table="t_correspondance">
    			<key column="id_intervenant" />
    			<many-to-many column="id_groupe" class="tables.T_Groupe" />
    		</set>
    		<set name="ficheS" cascade="all">
    			<key column="id_intervenant" />
    			<one-to-many class="tables.T_Dem_S" />
    		</set>
    		<set name="ficheOS" cascade="all">
    			<key column="id_intervenant" />
    			<one-to-many class="tables.T_Dem_OS" />
    		</set>
    	</class>
    ...
    Je suppose que ces infos devront suffire...
    (@_@)

  19. #19
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    Donc euh oui, je pense que ca devrait aller.
    Voici mon raisonnement concernant la construction de requetes via l'API Criteria.

    Ici, je veux des Domaines donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Criteria crit = session.createCriteria(T_Domaine.class);
    Ensuite, je veux aller chercher mon attribut "id_intervenant" pour aller identifier la personne dont il est question. Pour y aller, je dois passer, en naviguant via tes relations par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T_Domaine --groupes--> T_Groupe --correspondance--> T_Intervenant > id_intervenant.
    On construit donc les sous criteria pour aller jusqu'a intervenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    crit.createCriteria("groupes")
              .createCriteria("correspondance")
    Je suis maintenant arrivé à T_Intervenant, je n'ai donc plus qu'a mettre la condition sur l'id_Intervenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                   .add(Restrictions.eq("id_intervenant",idIntervenant));
    Bon, ca reste "a tester" car je viens de le faire à la volée, mais c'est ainsi que j'aurai procédé

    Résume :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Criteria crit = session.createCriteria(T_Domaine.class);
    crit.createCriteria("groupes")
              .createCriteria("correspondance")
                   .add(Restrictions.eq("id_intervenant",idIntervenant));
    En espérant avoir éclaircie ta vision des requetes avec Criteria (sauf si ca ne fonctionne pas )
    See you, space cowboy... and if you're satisfied, click on

  20. #20
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    Points : 90
    Points
    90
    Par défaut
    Ca marche impécablement.
    J'ai encore un peu de mal à comprendre les criteria.
    En fait dans ma tête c'est clair, mais quand il faut le traduire sous forme de criteria, je bloque... (mais, je crois que c'est parce que je ne commence pas par les exemple les plus simples... )

    Merci encore pour la soluce.
    Et bravo !
    (@_@)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [LDAP] Impossible de faire une requête avec plus de 1 condition
    Par mower666 dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 15/02/2013, 11h24
  2. [Toutes versions] Comment faire une requête avec nombre de paramètres dynamiques?
    Par BornToBe dans le forum VBA Access
    Réponses: 6
    Dernier message: 24/04/2012, 19h23
  3. DOA : Comment faire une requête avec paramètre ?
    Par juju1988 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 22/04/2011, 09h27
  4. comment faire une requête avec une association porteuse de données
    Par gaelle95 dans le forum Accès aux données
    Réponses: 3
    Dernier message: 25/11/2009, 15h49
  5. [phpMyAdmin] Faire une requête avec trois tables
    Par camzo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 04/12/2006, 22h55

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