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 :

probleme jointure criteria


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut probleme jointure criteria
    Bonjour tout le monde!
    Je rencontre un petit problème sur la jointure par criteria :

    J'ai un objet 'groupe' et un objet 'eleve' avec une relation bidirectionnelle many-to-one.
    --> Quand je teste le mapping hibernate sur la relation tout est nikel je peux accéder au groupe à partir de l'élève et je peux avoir pour un groupe tout les élèves

    J'ai enfin un autre objet 'statistique' qui a une relation unidirectionnel many-to-one vers l'élève.
    --> Quand je teste le mapping hibernate sur la relation tout est nikel je peux connaitre les statistiques de l'élève.

    Je souhaite maintenant récupérer les statistiques du groupe dans son ensemble et c'est la que ça plante :
    [ERROR] JDBCExceptionReporter - ORA-00904: invalid column name
    J'ai mis en mode debug, voici la requête générée :
    Hibernate: select this_.ST_NOTE as ST1_29_0_ from E_STAT this_ where groupe2_.GP_NUME=? and eleve1_.EL_NUME=? and this_.ST_DATE>=? and this_.ST_DATE<=?
    Il a crée les alias pour 'groupe' et 'eleve' mais il n'a pas créer les jointures dans le from
    il aurait du mettre from E_STAT this_, E_ELEVE eleve1_, E_GROUPE groupe2_ !!!!

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    Au niveau de la base pour les clés étrangères:
    Table Eleve : codeEleve, code Groupe, ...
    Table Groupe : codeGroupe, ...
    Table Statistique : codeEleve, ...
    Au niveau du mapping :
    <class name="StatistiqueImpl" table="E_STAT">
    <cache usage="read-write"/>
    <composite-id name="identifiantStatistique" class="IdentifiantStatistiqueImpl">
    <key-property name="dateStatistique" column="ST_DATE"/>
    <key-many-to-one name="eleve" class="EleveImpl" column="ST_EL_NUME" lazy="false" />
    </composite-id>
    <property name="note" column="ST_NOTE" update="false"/>
    </class>
    <class name="EleveImpl" table="E_ELEVE">
    <cache usage="read-write"/>
    <id name="code" column="EL_NUME">
    <generator class="assigned"/>
    </id>
    <property name="nom" column="EL_NOM" update="false"/>
    <property name="prenom" column="EL_PRENOM" update="false"/>
    <many-to-one name="groupe" class="GroupeImpl" column="EL_GP_NUME" lazy="false" update="false"/>
    </class>
    <class name="GroupeImpl" table="E_GROUPE">
    <cache usage="read-write"/>
    <id name="code" column="GP_NUME">
    <generator class="assigned"/>
    </id>
    <property name="libelle" column="GP_L" update="false"/>
    <set name="eleves" inverse="true" lazy="false">
    <cache usage="read-write"/>
    <key column="EL_GP_NUME" />
    <one-to-many class="EleveImpl"/>
    </set>
    </class>
    Voici ma requete :
    Criteria c = session.getSession().createCriteria(StatistiqueImpl.class);
    c.add(Restrictions.ge("identifiantStatistique.dateStatistique",dateStatistique));

    Criteria critEleve = c.createCriteria("identifiantStatistique.eleve");

    Criteria critGp = critEleve.createCriteria("groupe");
    critGp.add(Restrictions.eq("code",codeGroupe));
    Si je fais : critEleve.add(Restrictions.eq("code",codeEleve)); j'arrive à récupérer les données de l'élève car j'ai la colonne codeEleve dans ma table de statistique. Par contre j'aimerai qu'il fasse la jointure avec la table Eleve pour récupérer tous les élèves dont le codeGroupe correspond à la valeur du criteria

    Quelqu'un pourrait m'éclairer sur le problème sous-jacent merci!

  3. #3
    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
    Tu peux nous montrer les mappings ainsi que ta requête Hibernate ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    lol on a valider notre post a quelques secondes d'intervalles

  5. #5
    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
    Dans ton code, tu cites 3 criteria.
    Ce sont 3 requêtes ou tu veux en faire une seule ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    Bin en premier j'en avais fait une seule
    et ensuite j'en ai fait 3 car 2 jointures avec 3 tables!

    Le code pour une seule critéria :
    c = session.getSession().createCriteria(
    StatistiqueImpl.class);
    c.add(Restrictions.eq("identifiantStatistique.eleve.groupe.code", codeGroupe))
    c.add(Restrictions.ge("identifiantStatistique.dateStatistique",
    dateStatistique));
    Je suis en train de me demander si c'est pas une histoire de stratégie de chargement que j'ai configuré avec lazy='false'
    la documentation précise :

    15.5. Peuplement d'associations de manière dynamique
    Vous pouvez spéficier au moment de l'exécution le peuplement d'une association en utilisant setFetchMode() (c'est-à-dire le chargement de celle-ci). Cela permet de surcharger les valeurs "lazy" et "outer-join" du mapping.
    je vais essayer pour forcer la jointure

  7. #7
    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
    Tu peux faire tes 2 jointures dans un seul Criteria.

    Si tu as choisi Lazy = false, tes données seront chargées donc pas de problème.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    oui mais comment ? ça devrait marché vu que dans la requête il me crée un alias avant le nom de la colonne sauf que l'alias n'apparait pas dans le from !!!

    c = session.getSession().createCriteria(
    StatistiqueImpl.class);
    c.add(Restrictions.eq("identifiantStatistique.eleve.groupe.code", codeGroupe))
    c.add(Restrictions.ge("identifiantStatistique.dateStatistique",
    dateStatistique));
    quand je fais : 'identifiantStatistique.eleve' il devrait créer une jointure entre la table statistique et élève non?
    et quand je fais :'identifiantStatistique.eleve.groupe' il devrait créer une jointure entre la table élève et groupe non ?

    Il y a un truc bizzare aussi :
    Si je fais :
    c = session.getSession().createCriteria(
    StatistiqueImpl.class);
    c.add(Restrictions.eq("identifiantStatistique.eleve.code",codeEleve);
    j'obtiens la requete :
    Hibernate: select this_.ST_NOTE as ST1_29_0_, this_.ST_EL_NUME as ST3_29_0_ from E_STAT this_ where this_.ST_EL_NUME=?
    Donc il ne fait jamais de jointure entre les tables statistique et eleve et pourtant j'ai toutes les données concernant les élèves et même leur groupe quand je regarde en mode debug la list result???
    j'y comprend plus rien...
    comment est-ce possible?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    ha oui et si je fais :

    c = session.getSession().createCriteria(
    StatistiqueImpl.class);
    c.add(Restrictions.eq("identifiantStatistique.eleve.groupe.code",
    codeGroupe));
    j'obtiens :
    [ERROR] ServiceRechercheStatistiqueImpl - could not resolve property: identifiantStatistique.eleve.groupe.code of: StatistiqueImpl
    alors que j'ai vérifié et fait vérifier tout les get y sont!!!

    en plus la requête généré ne fait pas apparaitre le groupement!!

    Hibernate: select this_.ST_NOTE as ST1_29_0_, this_.ST_EL_NUME as ST2_29_0_ from E_STAT this_ where this_.ST_EL_NUME=?
    j'y comprens encore plus que rien

  10. #10
    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
    Pour ta dernière requête il me semble que c'est logique qu'il n'y ait pas de jointure.
    En effet, celle-ci est inutile puisque ta table Stats contient le code de l'élève, n'est-ce pas ?

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    Oui en effet,
    mais comment récupère t-il dans ce cas les autres données de l'élève ?
    lancerait-il des requêtes que je ne verrai pas?

    J'ai découvert une piste mais je ne sais pas trop l'exploiter :
    quand je fais :
    c.add(Restrictions.eq("identifiantStatistique.eleve.code",
    codeEleve));
    Hibernate peuple tout mes objets (statistique, élève et groupe)

    par contre quand je fais :
    c.add(Restrictions.eq("identifiantStatistique.eleve.nom",
    nomEleve));
    Hibernate plante :
    could not resolve property: identifiantStatistique.eleve.nom of: StatistiqueImpl
    je me dit donc que c'est un probleme de configuration car dans ma table statistique je n'ai en effet que le numéro de l'élève: Normalement hibernate ne devrait-il pas créer une jointure entre la table stat et la table élève sur le champ 'numero_Eleve' si je le configure comme ceci ?

    <class name="StatistiqueImpl" table="E_STAT">
    <cache usage="read-write"/>
    <composite-id name="identifiantStatistique" class="IdentifiantStatistiqueImpl">
    <key-property name="dateStatistique" column="ST_DATE"/>
    <key-many-to-one name="eleve" class="EleveImpl" column="ST_EL_NUME" lazy="false" />
    </composite-id>
    <property name="note" column="ST_NOTE" update="false"/>
    </class>

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 65
    Par défaut
    Bon j'ai trouvé une solution mais elle ne me plait pas vraiment... si quelq'un peut donner son avis ce serait cool!

    Criteria c = session.getSession().createCriteria(
    StatistiqueImpl.class);
    Criteria critGroup = session.getSession().createCriteria(
    GroupeImpl.class);
    critGroup
    .add(Restrictions.eq("code", codeGroupe));
    Groupe groupement=(Groupe) critGroup.list().get(0);
    c.add(Restrictions.in("identifiantStatistique.eleve",
    groupe.getEleves()));
    Je suis obligé de pallier à la jointure en récupérant moi meme le groupe recherché (donc un seul par défaut d'où le get(0) ) et en peuplant ma liste d'élèves par un criteria IN avec les élèves du groupe trouvé!!

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

Discussions similaires

  1. Probleme jointure trop de résultats
    Par krovomi dans le forum Requêtes
    Réponses: 3
    Dernier message: 28/06/2006, 09h24
  2. probleme jointure externe
    Par lazzeroni dans le forum Oracle
    Réponses: 1
    Dernier message: 24/05/2006, 10h38
  3. Probleme jointure d'une table sur elle même
    Par fred64 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/05/2006, 15h01
  4. Probleme jointure left
    Par lamoufle dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/12/2005, 20h45
  5. probleme jointures
    Par blasted dans le forum ASP
    Réponses: 3
    Dernier message: 14/07/2005, 14h49

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