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 :

Criteria,FetchMode.JOIN et collection


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Criteria,FetchMode.JOIN et collection
    Bonjour à tous,

    Je rencontre un problème auquel je ne trouve pas de solution dans la doc d'Hibernate.

    Je vais essayer d'être le plus clair possible.
    Disons que j'ai 3 classes.

    La première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Piece{
    int id;
    List composants;
    }
    La deuxième:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Composant{
    int id;
    Article article;
    Piece piece;
    }
    La dernière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public class Article{
    int id;
    String nom;
    }
    Le mapping des relations est le suivant:

    Pièce<->Composant
    Dans piece.hbm.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            <list name="composants" table="COMPOSANT" inverse ="false">
                <key column="ID_PIECE" />
                <index column="PSN" />
                <one-to-many class="production.Composant" />
            </list>
    Dans composant.hbm.xml:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            <many-to-one name="piece" class="production.Piece"
                update="false" insert="false" fetch="select">
                <column name="ID_PIECE" precision="10" scale="0" not-null="true" />
            </many-to-one>
    Composant -> Article:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            <many-to-one name="article" class="production.Article"
                update="false" insert="false" fetch="select">
                <column name="ID_ARTICLE" precision="10" scale="0"
                not-null="true" />
            </many-to-one>
    Je souhaite récupérer un certains nombre de pieces depuis une requête basée sur l'API Criteria.
    Le code ressemble à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Criteria crit = session.createCriteria(Piece.Class);
    crit.addRestrictions...
     
    crit.setFetchMode("composants",FetchMode.JOIN);
    crit.setFetchMode("composants.article",FetchMode.JOIN);
     
    List ret = crit.list();
    Le problème est que ma liste ret contient des doublons d'instances de Piece.
    En fait, il y'a autant d'entrées que de Composants liés au pièces retournées.
    Par exemple si toutes mes pièces ont 2 composants, alors il y'aura 1 doublon pour chacune des pièces.
    Pourtant, chacune des pièces est bien chargée. J'arrive parfaitement à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Piece p = (Piece)ret.get(0);
    p.getComposants.get(0);
    p.getComposants.get(1);
    ...
    Auriez-vous une solution pour éviter les doublons?

    Merci d'avance!

  2. #2
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 7
    Points : 6
    Points
    6
    Par défaut La solution dans la FAQ!
    Bonjour à tous!

    J'ai finallement trouvé la solution dans la FAQ Hibernate aux niveau des Advanced Problems.

    En fait, il suffit de rajouter ceci au niveau du Criteria:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    Il y'a d'autres solutions et les explications sont plutôt intéressantes.
    voir :
    "Hibernate does not return distinct results for a query with outer join fetching enabled for a collection (even if I use the distinct keyword)?"
    dans la page http://www.hibernate.org/117.html?cmd=prntdoc.

    @+!

  3. #3
    Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    J'avais exactement le même problème que toi, merci beaucoup

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

Discussions similaires

  1. Api Criteria left join fetch sur plusieur table
    Par makroute dans le forum Hibernate
    Réponses: 1
    Dernier message: 16/05/2011, 11h36
  2. [Criteria] ne pas prendre toutes les colonnes dans un Join
    Par Sniper37 dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/03/2009, 18h30
  3. Réponses: 0
    Dernier message: 11/11/2008, 19h52
  4. Criteria force inner join
    Par grizzz dans le forum Hibernate
    Réponses: 0
    Dernier message: 18/09/2008, 14h19
  5. utiliser Criteria pour un JOIN WITH
    Par Naeco dans le forum Hibernate
    Réponses: 2
    Dernier message: 24/06/2008, 17h28

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