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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    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 éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 163
    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 éclairé
    Inscrit en
    Avril 2006
    Messages
    238
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 238
    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 éprouvé
    Inscrit en
    Juillet 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juillet 2006
    Messages : 74
    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.

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

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