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 :

erreur dans une jointure HQL


Sujet :

Hibernate Java

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut erreur dans une jointure HQL
    Bonjour,

    J'ai une erreur dans ma reqûete HQL (c'est une requête externalisé que je place dans mon fichier de mapping)

    Voici ma requête HQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <query name="proc.filiere.par.dist.unique">							
    	select distinct (p.codeFiliere)
    	from Procedure as p join bean.Filiere as fil		
    	where p.codeFiliere = fil.codeFiliere 
    		and codeDist = ?   		
    </query>
    Pourtant elle ne fonctionne pas !

    Voici un extrait de ma trace :
    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
     
    DEBUG [http-8080-Processor25] (QueryTranslatorImpl.java:252) - --- HQL AST ---
     \-[QUERY] 'query'
        +-[SELECT_FROM] 'SELECT_FROM'
        |  +-[FROM] 'from'
        |  |  +-[RANGE] 'RANGE'
        |  |  |  +-[DOT] '.'
        |  |  |  |  +-[IDENT] 'bean'
        |  |  |  |  \-[IDENT] 'Procedure'
        |  |  |  \-[ALIAS] 'p'
        |  |  \-[JOIN] 'join'
        |  |     +-[DOT] '.'
        |  |     |  +-[IDENT] 'bean'
        |  |     |  \-[IDENT] 'Filiere'
        |  |     \-[ALIAS] 'fil'
        |  \-[SELECT] 'select'
        |     +-[DISTINCT] 'distinct'
        |     \-[DOT] '.'
        |        +-[IDENT] 'p'
        |        \-[IDENT] 'codeFiliere'
        \-[WHERE] 'where'
           \-[AND] 'and'
              +-[EQ] '='
              |  +-[DOT] '.'
              |  |  +-[IDENT] 'p'
              |  |  \-[IDENT] 'codeFiliere'
              |  \-[DOT] '.'
              |     +-[IDENT] 'fil'
              |     \-[IDENT] 'codeFiliere'
              \-[EQ] '='
                 +-[IDENT] 'codeDist'
                 \-[PARAM] '?'
     
    DEBUG [http-8080-Processor25] (ErrorCounter.java:68) - throwQueryException() : no errors
    DEBUG [http-8080-Processor25] (HqlSqlBaseWalker.java:111) - select << begin [level=1, statement=select]
    DEBUG [http-8080-Processor25] (FromElement.java:104) - FromClause{level=1} :  bean.Procedure (p) -> procedure0_
    DEBUG [http-8080-Processor25] (LiteralProcessor.java:121) - setSQLValue() bean.Filiere -> null
    DEBUG [http-8080-Processor25] (FromReferenceNode.java:51) - Resolved :  bean.Filiere -> null
    Je ne comprends pas pourquoi il y a marquer "bean.Filiere -> null" ??

    Quelqu'un voit une erreur dans mon code ?

    Merci

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Difficile à dire comme ça sans connaitre tes mappings.
    Pourquoi "codeDist = ?" n'est il pas préfixé comme "p.codeFiliere" ou "fil.codeFiliere" ?
    Ensuite ta jointure me semble douteuse.
    J'aurais plutot ecrit un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from Procedure as p join p.quelquechose as fil

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    En ce qui concerne mon mapping de Procedure le voila :

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="bean.Procedure" schema="schema" table="PROCEDURE">	
    		<composite-id>
    			<key-property column="FILIERE_CODE" length="18" name="codeFiliere" type="int"/>
    			<key-property column="PROCEDURE_CODE" length="18" name="codeProc" type="int"/>
    		</composite-id>
     
    		...
     
    		<set name="listeMail" lazy="true">
    			<key>
    				<column name="FILIERE_ID"/>
    				<column name="PROC_ID"/>
    			</key>
    			<one-to-many class="bean.Mail"/>
    		</set>
    	</class>
     
    	<query name="proc.filiere.par.dist.unique">							
    		select distinct (p.codeFiliere)
    		from Procedure as p join bean.Filiere as fil		
    		where p.codeFiliere = fil.codeFiliere 
    			and codeDist = ?   		
    	</query>
     
    </hibernate-mapping>
    Le mapping pour Filiere (classe avec laquelle je souhaite faire ma jointure) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
    	<class name="bean.Filiere" schema="schema" table="FILIERE">
    		<id column="FILIERE_CODE" name="codeFiliere" type="int">
    			<generator class="increment" />
    		</id>
    		<property column="FILIERE_LIBELLE" length="50" name="libFiliere" not-null="true" type="string" />
    		<property column="FILIERE_TYPE" length="10" name="typeFiliere" type="string" />
    	</class>
     
     
    </hibernate-mapping>

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <query name="proc.filiere.par.dist.unique">			
    <div style="margin-left:40px">
    select distinct (p.codeFiliere)
    from Procedure as p, Filiere as fil		
    where p.codeFiliere = fil.codeFiliere </div></query>
    Ca c'est pour la jointure.
    Il sort d'où ton "codeDist " ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut
    alors codeDist c attribut que jai supprimé sasn faire exprès de l'extrait de fichier que je t'ai envoyé. C'est un attribut de Procedure voila la ligne :

    <property column="DIST_ID" length="100" name="codeDist" not-null="true" type="string"/>

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut
    c'est bon ca marche. en fait c'est comme une requête sql normal, je sais pas pourquoi j'ai cherché la complexité !

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    N'oublie pas d'ecrire p.codeDist au lieu de codeDist.

    Disons que selon la requête que tu écris, la version HQL peut être bien plus simple.
    Si tu as 3 classes, classe1, classe2 et classe3 et que tu veux ramenez tous
    les objets de classe1 avec une condition sur classe3, tu n'auras pas besoin
    de faire une jointure explicite entre ces 3 objets.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from classe1
    where classe1.classe2.classe3.attributs = 'uneValeur'
    La jointure entre les 3 tables est faite automatiquement.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 65
    Points : 26
    Points
    26
    Par défaut
    Ok, merci pour ton aide

  9. #9
    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 Nota Bene :
    Click to Resolu

    Et : bon cour@ge chtite Galak, bientôt la fin...

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

Discussions similaires

  1. Erreur dans une requête HQL
    Par Philcmoi dans le forum Hibernate
    Réponses: 5
    Dernier message: 05/09/2008, 22h24
  2. [MySQL] Erreur dans une requête avec jointures
    Par bobic dans le forum Langage SQL
    Réponses: 17
    Dernier message: 03/08/2006, 13h04
  3. Réponses: 2
    Dernier message: 11/08/2004, 15h01
  4. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20
  5. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15

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