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 :

jointure en HQL


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut jointure en HQL
    Bonjour à tous !

    J'essaye de faire une jointure avec Hibernate / Hibernate Synchronizer. Elle me renvoie une NullPointerException. J'ai beau lire la doc d'Hibernate, je ne vois pas. Et c'est d'autant plus frustrant que j'ai fait la même requête en SQL depuis un moment !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ActeurBeanDAO dao = new ActeurBeanDAO();
     
    Query nomsQuery = dao.getQuery("select nomActeur as ac from asp.beans.ActeurBean as acteurs inner join asp.mainCourante.AgentBean as agents where acteurs.idActeur = agents.acteurIdActeur");
    Le code des DAO a été généré par Hibernate Synchronizer et je n'ai pas de raison de croire que c'est lui le coupable.

    La même chose en SQL donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select nom_acteur from acteur inner join agent on acteur.id_acteur = agent.acteur_id_acteur

    Mon fichier de mapping Acteur est le suivant :

    Code XML : 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
     
    <?xml version="1.0"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
     
     
     
    <hibernate-mapping package="asp.beans">
    	<class
    		name="ActeurBean"
    		table="acteur"
    	>
     
    		<meta attribute="sync-DAO">true</meta>
     
     
    		<id
    			name="idActeur"
    			column="id_acteur"
    			type="java.lang.Long"
    			length="32"
    		>
    				<generator class="increment"/>
     
    		</id>
     
    		<property
    			name="nomActeur"
    			column="nom_acteur"
    			type="string"
    			not-null="true"
    		/>
    		<property
    			name="prenomActeur"
    			column="prenom_acteur"
    			type="string"
    			not-null="true"
    		/>
    		<property
    			name="roleActeur"
    			column="role_acteur"
    			type="java.lang.Long"
    			not-null="false"
    			length="6"
    		/>
    		<property
    			name="clePriveeActeur"
    			column="cle_privee_acteur"
    			type="string"
    			not-null="true"
    		/>
    		<property
    			name="clePubActeur"
    			column="cle_pub_acteur"
    			type="string"
    			not-null="true"
    		/>
     
     
    	</class>
    </hibernate-mapping>


    Apparement, le mapping se passe bien.

    Si quelqu'un a une idée, merci d'avance !

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Et avec ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select nomActeur as ac
    from asp.beans.ActeurBean as acteurs, asp.mainCourante.AgentBean as agents
    where acteurs.idActeur = agents.acteurIdActeur

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut
    Non, c'est toujours pareil... Je te mets la trace de l'exception, qui semblerait indiquer que ma jointure renvoie null (pourtant, visuellement comme en SQL ce n'est pas le cas) :

    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
     
    javax.servlet.ServletException
    	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    	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:689)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
    	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
    	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:689)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
     
    cause mère
     
    java.lang.NullPointerException
    	org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:309)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3275)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3067)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)
    	org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)
    	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:228)
    	org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
    	org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
    	org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
    	org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
    	org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
    	org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
    	org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
    	org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
    	asp.beans.base._BaseRootDAO.getQuery(_BaseRootDAO.java:493)
    	asp.beans.base._BaseRootDAO.getQuery(_BaseRootDAO.java:481)
    	asp.mainCourante.InitActionVacation.execute(InitActionVacation.java:54)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    	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:689)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    	org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
    	org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
    	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:689)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    Il n'y aurait pas un moyen (dans Eclipse ou en stand-alone) de tester ma requête HQL, comme ça, "brute" ?

    Merci de toute façon !

  4. #4
    Membre éclairé Avatar de bouchette63
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 257
    Par défaut
    Bonjour,
    Il n'y aurait pas un moyen (dans Eclipse ou en stand-alone) de tester ma requête HQL, comme ça, "brute" ?
    Je sais que le plugin Hibernator fournit une Query view pour tester les requêtes en HQL.

  5. #5
    BsT
    BsT est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 72
    Par défaut
    Est il possible d'avoir le mapping de Agent.

    Il me semble qu'une association entre agent et acteur doit etre présente dans le mapping pour l'utiliser comme inner join dans du HQL.

    asp.beans.ActeurBean as acteurs inner join asp.mainCourante.AgentBean as agents

    De plus la jointure rend inutile la partie de la clause WHERE acteurs.idActeur = agents.acteurIdActeur. (si c'est comme je l'imagine)

    Enfin je ne suis pas sur de l'utilité du 'ac' dans la clause SELECT

    Edit : erreur de ma part le as ac est valide en HQL

  6. #6
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut
    Merci à vous deux !

    Alors, pour le mapping d'Agent :

    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
     
     
    <?xml version="1.0"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
    	"-//Hibernate/Hibernate Mapping DTD//EN"
    	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
     
     
     
    <hibernate-mapping package="asp.beans">
    	<class
    		name="ActeurBean"
    		table="acteur"
    	>
     
    		<meta attribute="sync-DAO">true</meta>
     
    		<id
    			name="idActeur"
    			column="id_acteur"
    			type="java.lang.Long"
    			length="32"
    		>
    				<generator class="increment"/>
     
    		</id>
     
    		<property
    			name="nomActeur"
    			column="nom_acteur"
    			type="java.lang.String"
    			not-null="true"
    		/>
    		<property
    			name="prenomActeur"
    			column="prenom_acteur"
    			type="java.lang.String"
    			not-null="true"
    		/>
    		<property
    			name="roleActeur"
    			column="role_acteur"
    			type="java.lang.Long"
    			not-null="false"
    			length="6"
    		/>
    		<property
    			name="clePriveeActeur"
    			column="cle_privee_acteur"
    			type="java.lang.String"
    			not-null="true"
    		/>
    		<property
    			name="clePubActeur"
    			column="cle_pub_acteur"
    			type="java.lang.String"
    			not-null="true"
    		/>
     
    	</class>
     
    </hibernate-mapping>
    Effectivement, il semblerait qu'il faille un mapping pour ma jointure. J'ai essayé à coup de "join" et de "many-to-one" mais d'une la doc d'Hibernate ne me parle pas, de deux tous les tutos que j'ai trouvé étaient pour le moins imprécis.

    Si je reprends :

    ***

    Soient Acteur et Agent, deux classes persistantes : ça, ça marche.

    Soit la relation "à un même Acteur peuvent correspondre plusieurs Agents".

    Soit le besoin de faire une jointure entre les deux.

    ***

    Bon, alors apparement, il faut :

    - créer un "set" + "one-to-many" dans Acteur
    - créer un "many-to-one" et une propriété de type PersistentSet qui retiendra les clés étrangères dans Agent
    - et lier les deux.

    Mais bon, je m'emmêle les pinceaux et pour le moment je n'arrive à rien qui se déploie dans Tomcat sans qu'Hibernate ne se plaigne (le dernier est lancé au chargement du premier).

    Quelqu'un pourrait-il m'éclairer de ses lumières, s'il vous please ?

  7. #7
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 50
    Par défaut
    Bon, bon, bon... J'ai trouvé !!! Et vous allez voir que ça vaut son pesant de cacahuètes !

    Alors, d'abord, pour trouver la bonne syntaxe du fichier de mapping permettant de faire ma jointure, j'ai gentillement demandé à mon outil de modélisation relationnelle de revoir mon schéma en codant la clé étrangère en dur. Puis, j'ai demandé au moins gentil Hibernate Synchronizer de pondre le fichier de mapping qui va bien. Donc, il m'a pondu ce qui suit, pour info, mais vous comprendrez ensuite pourquoi lui est moins gentil :

    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
     
    <many-to-one
    			name="acteurIdActeur"
    			column="acteur_id_acteur"
    			class="asp.beans.ActeurBean"
    			not-null="false">
    </many-to-one>
     
     
     
     
    <set name="agents" inverse="true">
    			<key column="id_acteur"/>
    			<one-to-many class="asp.mainCourante.AgentBean"/>
    </set>
    Bon, ensuite, comme ça ne marchait toujours pas, j'ai googlé une fois de plus et je suis tombé sur le "known issue that will probably not be fixed" suivant (cherchez NullPointerException dans la page) :

    http://www.hibernate.org/117.html?cm...hist&refnode=7

    Et c'est là qu'Hibernate Synchronizer est moins gentil : dans le code DAO généré, il surcharge equals(), d'où mon problème...

    Bon, donc, j'emploie le contournement préconisé et grrr... Toujours pas. Mais l'erreur change ! Alors je google à nouveau et je tombe là-dessus :

    http://lists.jboss.org/pipermail/hib...er/002234.html

    Donc, en gros, ma jointure explicite est une "syntaxe non supportée" et moi je suis aussi dépité que le gars qui a posté ça ! Donc, Fr1man avait raison et ma jointure devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Query nomsQuery = dao.getSession().createQuery("select acteurs.nomActeur from asp.beans.ActeurBean as acteurs, asp.mainCourante.AgentBean" +
    		" as agents WHERE acteurs.idActeur = agents.acteurIdActeur");
     
    Iterator results = nomsQuery.iterate();
    Ha oui, parce que si je ne fais pas le "getSession()", je me prends un "session is closed", évidemment...

    Voilà, je le poste ici pasque je me dis que ça peut peut-être servir...

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

Discussions similaires

  1. Jointure en HQL
    Par Oulbann dans le forum Hibernate
    Réponses: 4
    Dernier message: 07/11/2010, 16h28
  2. jointure en HQL
    Par onlajoy dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/09/2010, 17h21
  3. Requete avec jointure en HQL
    Par Alyx² dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/05/2008, 09h13
  4. Jointure requete HQL
    Par red210 dans le forum Hibernate
    Réponses: 15
    Dernier message: 15/10/2007, 17h04
  5. [HIBERNATE] Jointure en HQL
    Par faya972 dans le forum Hibernate
    Réponses: 1
    Dernier message: 04/05/2006, 11h08

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