-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 11 posts ] 
Author Message
 Post subject: Traitement des résultats d'une requête avec jointure
PostPosted: Mon Jun 13, 2005 11:59 am 
Newbie

Joined: Mon Jun 13, 2005 5:32 am
Posts: 4
Bonjour à tous,

Je suis tout nouveau dans l'utilisation d'Hibernate, et je fais quelques tests avant de me lancer dans le developpement d'une grosse appli.

Ce test se base sur MySQL en local, j'ai deux tables : Contact et Titre.

Voici un MLD :
Contact (id, nom, prenom, age, #num_titre)
Titre (id, libelle)

Je cherche à effectuer une requête toute bête, avec une jointure, mais je ne vois pas comment traiter le résultat.

Voici mon code :

Code:

Query q = session.createQuery(
          "from Titre" +
          "inner join Contact " +
          "where Contact.num_titre = Titre.id"
          );
    System.out.println("Fin de la requête");
     
    Transaction tx = session.beginTransaction();
    tx.commit();
 
    try {
    Iterator it = q.iterate();
    int i=1;
    while(it.hasNext())
    {
       System.out.println("Enregistrement numero -> "+i);
       i++;
    }
    }catch(Exception e){System.out.println("Erreur");}



Et voici le résultat à la console :

Code:
Fin de la requête
Erreur


Je pense donc que la requête s'effectue correctement.

Pouvez-vous m'expliquer ce qui ne vas pas dans mon programme, et comment traiter les valeurs retournées par la requête.

Merci par avance.

Un nouveau venu, que ne cherche qu'à comprendre !!

_________________
Charles.


Top
 Profile  
 
 Post subject: Re: Traitement des résultats d'une requête avec jointure
PostPosted: Mon Jun 13, 2005 12:24 pm 
Regular
Regular

Joined: Tue May 03, 2005 8:19 am
Posts: 53
Location: Paris
Esssaye plutôt :
Code:

Query q = session.createQuery(
          "from Titre" +
          "inner join Contact " +
          "where Contact.num_titre = Titre.id"
          );
     
    Transaction tx = session.beginTransaction();
    tx.commit();
 
    try {
    Iterator it = q.iterate();
    System.out.println("Fin de la requête");

    int i=1;
    while(it.hasNext())
    {
       System.out.println("Enregistrement numero -> "+i);
       i++;
    }
    }catch(Exception e)
    {
       System.out.println("Erreur");
       e.printStackTrace();
    }


Tu devrais avoir
Code:
Erreur
org.hibernate.....

et tu comprendra surement le problème de ta query en lisant l'erreur JDBC.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 14, 2005 3:19 am 
Newbie

Joined: Mon Jun 13, 2005 5:32 am
Posts: 4
OK, merci de ton conseil je regarde ca tout de suite et je te tiens au courant

_________________
Charles.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 14, 2005 3:55 am 
Newbie

Joined: Mon Jun 13, 2005 5:32 am
Posts: 4
Je viens donc de tester avec les modifs que tu me disais d'apporter, j'ai donc bien un problème de syntaxe dans ma requête. En continuant de chercher j'ai modifié ma requête par rapport à ce que j'ai vu dans une aide, voici donc mon code actuel :

Code:
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
   
   System.out.println("Lancement de la requete");
   
   Query q = session.createQuery(
         "from Titre " +
           "inner join Contact ON Titre.id = Contact.num_titre"
         );
   
   System.out.println("Fin de la requête");
   
   tx.commit();

   try {
   Iterator it = q.iterate();
   int i=1;
   while(it.hasNext())
   {
      System.out.println("Enregistrement numero -> "+i);
      i++;
   }
   }catch(Exception e){
      System.out.println("Erreur");
      e.printStackTrace();
   }


Et voici l'erreur qui m'est retourné :

Code:
Lancement de la requete
Fin de la requête
Erreur
net.sf.hibernate.QueryException: outer or full join must be followed by path expression [from com.minosis.hibernate.Titre inner join Contact ON Titre.id = Contact.num_titre]
   at net.sf.hibernate.hql.FromParser.token(FromParser.java:166)
   at net.sf.hibernate.hql.ClauseParser.token(ClauseParser.java:87)
   at net.sf.hibernate.hql.PreprocessingParser.token(PreprocessingParser.java:123)
   at net.sf.hibernate.hql.ParserHelper.parse(ParserHelper.java:29)
   at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:149)
   at net.sf.hibernate.hql.QueryTranslator.compile(QueryTranslator.java:138)
   at net.sf.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:294)
   at net.sf.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:1562)
   at net.sf.hibernate.impl.SessionImpl.iterate(SessionImpl.java:1592)
   at net.sf.hibernate.impl.QueryImpl.iterate(QueryImpl.java:27)
   at Test.main(Test.java:30)


D'après ce que je vois, j'ai une erreur de syntaxe avec le inner joi, mais j'ai beau chercher je n'arrive pas à trouver mon erreur, quelqu'un peut-il m'aider svp ??

Une autre chose que je ne comprend pas, c'est pourquoi la requête se lance correctement alors que quand je veux traiter les résultats j'ai une erreur ??? ça ne devrait pas planter avant ??

Merci par avance de votre aide au combien précieuse pour moi.

_________________
Charles.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 14, 2005 7:11 am 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
il faut lire la doc... hql n'est pas sql

inner join donne join
left outer join donne left join

mais lis la doc

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 14, 2005 9:41 am 
Newbie

Joined: Mon Jun 13, 2005 5:32 am
Posts: 4
anthony wrote:
il faut lire la doc... hql n'est pas sql

inner join donne join
left outer join donne left join

mais lis la doc


Pour info la doc je l'ai lu, et je ne fais que m'en servir.
Et dixit la doc :

Code:
from eg.Cat as cat
inner join cat.mate as mate
left outer join cat.kittens as kitten

Cf page : 95

Alors ne me dis pas que inner join n'existe pas.

Je suis un débutant dans Hibernate je l'accepte, mais pas un guignol que soumet ses problèmes pour avoir des réponses toutes crachées. Alors merci de ne pas m'envoyer chier sinon je vois pas à quoi sert ce forum.

_________________
Charles.


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 14, 2005 5:14 pm 
Hibernate Team
Hibernate Team

Joined: Thu Dec 18, 2003 9:55 am
Posts: 1977
Location: France
je comprends pas bien ton comportement la.
je ne vais pas m'abaisser a te parler de la meme maniere, bonne lecture du guide de référence.

PS: pour resoudre ton probleme, reviens aux sources d'Hibernate
PS2: encore une vulgarité et tu vires du forum, ce comportement n'est pas toléré ici

_________________
Anthony,
Get value thanks to your skills: http://www.redhat.com/certification


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 26, 2005 6:17 pm 
Beginner
Beginner

Joined: Tue Nov 09, 2004 12:22 pm
Posts: 44
Les types de jointures supportées sont celles de ANSI SQL
• inner join (jointure fermée)
• left outer join (jointure ouverte par la gauche)
• right outer join (jointure ouverte par la droite)
• full join (jointure ouverte totalement - généralement inutile)
Les constructions des jointures inner join, left outer join et right outer join peuvent être abbrégées.
Quote:
from eg.Cat as cat
join cat.mate as mate
left join cat.kittens as kitten


Dixit le manuel de référence.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Aug 26, 2005 6:21 pm 
Beginner
Beginner

Joined: Tue Nov 09, 2004 12:22 pm
Posts: 44
Les types de jointures supportées sont celles de ANSI SQL
• inner join (jointure fermée)
• left outer join (jointure ouverte par la gauche)
• right outer join (jointure ouverte par la droite)
• full join (jointure ouverte totalement - généralement inutile)
Les constructions des jointures inner join, left outer join et right outer join peuvent être abbrégées.
Quote:
from eg.Cat as cat
join cat.mate as mate
left join cat.kittens as kitten


Dixit le manuel de référence.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Aug 29, 2005 4:31 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
charlot wrote:
Alors ne me dis pas que inner join n'existe pas.

Je suis un débutant dans Hibernate je l'accepte, mais pas un guignol que soumet ses problèmes pour avoir des réponses toutes crachées. Alors merci de ne pas m'envoyer chier sinon je vois pas à quoi sert ce forum.


Anthony a tord mais il a raison.
inner join et left outer join existent, mais HQL n'est pas SQL, le mot clé ON n'existe pas, il est implicite dans un language de requêtage OO.

_________________
Emmanuel


Top
 Profile  
 
 Post subject:
PostPosted: Mon Aug 29, 2005 4:39 am 
Hibernate Team
Hibernate Team

Joined: Sun Sep 14, 2003 3:54 am
Posts: 7256
Location: Paris, France
En fait le parseur plante avant le ON.
les join en OO sont liés à une relation.
Donc si tu as une relation entre Contact et tritre (ie contact.getTitre() )
tu peux faire une jointure objet
Code:
select titre from Contact c inner join c.titre t where t.titre = :titre


Si tu n'as pas de déclaration d'assoication dans ton mapping, il te reste les joitures de type theta.

_________________
Emmanuel


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 11 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.