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 :

Requete HQL avec jointure


Sujet :

Hibernate Java

  1. #1
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut Requete HQL avec jointure
    Bonjour, je souhaiterais effectuer une requete de ce type:

    "SELECT batiment.etage FROM immobilier.Batiment batiment WHERE batiment.etage.libelle =:libelle"

    La structure:
    Un objet Batiment ayant un set "etage" d'objet de type Etage avec une association many-to-many.


    Est ce que quelqu'un pourrait me donner la traduction de ma requete en HQL qui fonctionne ?

    Cordialement,
    Christophe
    Christophe

  2. #2
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Cf http://www.hibernate.org/hib_docs/re.../queryhql.html

    from Batiment as batiment where batiment.etage.libelle='xxx'

    J'ai juste un léger doute à savoir si tu as un batiment qui a deux étages avec le bon libellé s'il te le sort une ou deux fois ... (à mon avis deux)

    Au passage, étrange ta relation many-many j'aurai plutot dit one-to-many (un étage peut "appartenir" à plusieurs bâtiments ??)

  3. #3
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut presque
    en fait effectivement, à la reflection, du many-to-many, c'est très con...
    c'est modifié, j'ai maintenant (merci pour la remarque )
    un set d'etage (one-to-many) dans mon batiment
    un set de piece (one-to-many) toujours dans mon batiment
    un batiment dans ma piece (many-to-one)
    un etage dans ma piece (many-to-onre)
    (histoire de savoir ou la piece "1234342" se trouve sans itterer sur tous les batiments.)

    cependant j'ai l'erreur suivante:
    could not resolve property: etage of: unite.Batiment [FROM unite.Batiment as batiment WHERE batiment.etage.libelle=:libelle]


    ???
    Christophe

  4. #4
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ce qui "compte" c'est le nom de l'attribut Etage dans la classe Batiment, pas le nom de la classe Etage.

    Donc si tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Batiment {
      Etage e;
      ...
    }
    tu dois avoir comme requête :
    from Batiment as batiment where batiment.e.libelle='xxx'

  5. #5
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut le problême
    Le soucis, c'est que je n'ai pas qu'un etage dans mes batiments, du coup j'ai pas une reference direct a un objet, mais une collection d'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Batiment {
     
    	/**
             * identifiant non porteur de données.
             */
    	private int id_batiment;
    	private String libelle;
    	private Set etages;
    	private Set pieces;
     
    	public Batiment(){
     
    	}
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /**
             * @hibernate.one-to-many class="fr.gouv.defense.terre.rhc1.unite.Etage"
             * @return Set
             */
    	public Set<Etage> getEtages() {
    		return etages;
    	}
    et donc même en mettant une "s" cela me donne ça:
    net.sf.hibernate.QueryException: could not resolve property: etages of: unite.Batiment [FROM unite.Batiment as batiment WHERE batiment.etages.libelle=:libelle]


    Il y'aurait bien un truc comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select elements(batiment.etages) FROM unite.Batiment as batiment
    mais comment inclure la clause "where"?

    "WHERE batiment.etage.libelle=:libelle "... je pense que ca ne fonctionne pas non plus...

    erf erf erf... suggestion ? parce que ca m'aiderait bien
    Christophe

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Désolé, je suis vraiment à la ramasse aujourd'hui ^^

    Deux possibilités :
    1) Dans ta classe Etage, tu as une référence vers le bâtiment du genre Batiment b
    select batiment from Etage etage inner join etage.b as batiment where etage.libelle='xxx'
    2) Tu n'as pas cette référence.
    Dans ce cas, je pense que le mieux serait :
    select batiment from Batiment as batiment where exists (
    select etage from Etage as etage where etage.libelle='xxx' and etage in elements(batiment.etages)
    )

  7. #7
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut Presque ça
    C'est presque bon, je sent que j'approche de la solution, et je te remerci de l'aide que tu m'apporte.

    Je dis presque parce que voila :
    could not resolve property: etages of: unite.Batiment [SELECT batiment FROM unite.Batiment batiment WHERE exists ( SELECT etage FROM unite.Etage as etage WHERE etage.intitule=:libelle AND etage IN elements(batiment.etages))]
    une ultime idée?
    Christophe

  8. #8
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Euh... vraiment désolé, mais c'est pas mon jour, mais vu que personne d'autre n'a l'air de répondre, j'essaye d'aider quand même comme je peux ...

    Tu peux essayer :
    select batiment from Batiment as batiment join batiment.etages etage where etage.libelle='xxx' ?

  9. #9
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut snif
    Erf, heureusement que tu es là, parce que c'est kler que sinon j'aurai pas avancé cet après midi.

    Bon cependant ca me met encore l'erreur suivante (comme au début)

    could not resolve property: etages of: unite.Batiment [select batiment from unite.Batiment as batiment join batiment.etages etage where etage.intitule=:libelle]

    snif

    une autre idée

    Merci de l'interet que tu porte a mon problême, sincerment.
    Christophe

  10. #10
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut heu mes set
    Question est ce que ca pourrait etre du au fait que mes set sont ceux du package java.util.set?
    Christophe

  11. #11
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Non, ça c'est bon... Tu pourrais mettre ton fichier de mapping ?

  12. #12
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut
    si tot dit si tot fait :

    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
     
    <hibernate-mapping
    >
        <class
            name="unite.Batiment"
            table="unite_batiment"
        >
     
            <id
                name="id_batiment"
                column="id_batiment"
                type="int"
            >
                <generator class="native">
                  <!--  
                      To add non XDoclet generator parameters, create a file named 
                      hibernate-generator-params-Batiment.xml 
                      containing the additional parameters and place it in your merge dir. 
                  --> 
                </generator>
            </id>
     
            <property
                name="libelle"
                type="java.lang.String"
                update="true"
                insert="true"
                column="libelle"
            />
     
            <!--
                To add non XDoclet property mappings, create a file named
                    hibernate-properties-Batiment.xml
                containing the additional properties and place it in your merge dir.
            -->
     
        </class>
     
    </hibernate-mapping>
    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
    <?xml version="1.0" encoding="UTF-8"?>
     
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
        "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
     
    <hibernate-mapping
    >
        <class
            name="unite.Etage"
            table="unite_etage"
        >
     
            <id
                name="id_etage"
                column="id_etage"
                type="int"
            >
                <generator class="native">
                  <!--  
                      To add non XDoclet generator parameters, create a file named 
                      hibernate-generator-params-Etage.xml 
                      containing the additional parameters and place it in your merge dir. 
                  --> 
                </generator>
            </id>
     
            <property
                name="intitule"
                type="java.lang.String"
                update="true"
                insert="true"
                column="intitule"
            />
     
            <many-to-one
                name="batiment"
                class="unite.Batiment"
                cascade="none"
                outer-join="auto"
                update="true"
                insert="true"
                column="batiment"
            />
     
            <!--
                To add non XDoclet property mappings, create a file named
                    hibernate-properties-Etage.xml
                containing the additional properties and place it in your merge dir.
            -->
     
        </class>
     
    </hibernate-mapping>
    Christophe

  13. #13
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ok !

    Bon, ben maintenant essaye :

    select batiment from Etage as etage join etage.batiment batiment where etage.libelle='xxx'

  14. #14
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut heu...
    tu es sure?
    parce que je veux recuperer un etage selon son intitule, pas le batiment...
    Bon je vais essayer quand meme mais je pense pas que ca va marcher
    Christophe

  15. #15
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Euh... pas compris là ... je croyais que tu voulais le batiment qui avait un étage dont l'intitulé était xxx depuis le début ... J'ai rien compris ??

  16. #16
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Euh en fait ya même plus simple :

    select etage.batiment from Etage as etage where etage.libelle='xxx' (pas besoin d'un join ...)

  17. #17
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut
    lol non en fait je cherche à implementer la méthode getEtage(String _libelleEtage) de mon batiment.

    Cette methode doit me retourner l'etage nommé _libelleEtage qui se trouve dans la collection d'etage de mon batiment...

    Bon je vais chez moi, (je quitte le boulot, je lirais ta reponse chez moi dans 30 minutes)

    @ tout de suite et merci par avance
    Christophe

  18. #18
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ben alors deux possibilités :

    1) tu veux l'étage ayant un certain libellé dans un objet bâtiment que tu as déjà
    Dans ce cas, pas de requête en base, tu parcours le Set etages jusqu'à trouver le bon ...
    Attention à gérer le cas où plusieurs correspondent ...
    2) tu veux l'étage ou les étages ayant un certain libellé
    from Etage etage where etage.libelle='xxx'

  19. #19
    Membre habitué
    Avatar de chriscoolletoubibe
    Inscrit en
    Novembre 2006
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Novembre 2006
    Messages : 151
    Points : 135
    Points
    135
    Par défaut Ca marche merci :)
    Bon ca fonctionne je n'ai plus de message d'erreur.
    Cependant je n'arrive pas ajouter d'etage, donc je peu pas non plus verifier a 100%

    En gros j'ai mes setteur et getteur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Class Batiment{
     
    public void setEtages(Set _etages){
      this.etages=_etages;
    }
     
    public Set getEtages(){
      return this.etages;
    }
    }
    et quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Etage newEtage = new Etage(_idEtage,this);
    getEtages().add(newEtage);
    Ca n'enregistre rien... snifouille

    Comment faire?

    En tout cas, merci déjà pour la première enigme, je suis novice en hibernate, et du coup j'ai tendance a vouloir compliquer les choses.
    Christophe

  20. #20
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Désolé, je ne lis ta réponse que maintenant ...
    tu as fait un session.save(xxx) de quoi ?

    Dans tes fichiers de mapping, attention il n'y a pas de cascade.
    Je te conseille de regarder un peu la doc sur la manipulation de la session et les fichiers de mapping pour mieux comprendre cette partie.

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

Discussions similaires

  1. Unexpected Token dans requete HQL avec jointures
    Par philoo_le_foo dans le forum Hibernate
    Réponses: 18
    Dernier message: 22/04/2010, 19h48
  2. Requete SQL avec jointure multiple
    Par kissskoool dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/01/2008, 01h07
  3. Requete update avec jointure d'une requête
    Par bart64 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 28/05/2007, 20h31
  4. Requete SELECT avec jointures
    Par escteban dans le forum Requêtes
    Réponses: 10
    Dernier message: 18/04/2007, 12h16
  5. Afficher une requete MYSQL avec jointure
    Par Higestromm dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/12/2005, 15h52

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