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 :

[Hibernate] Join fetch et set (one-to-many)


Sujet :

Hibernate Java

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut [Hibernate] Join fetch et set (one-to-many)
    Bonjour !

    J'ai un problème avec hibernate (on s'en serait un peu douté)
    Voici les données :
    Une classe Price qui contient des prix de produits par client (rien de bien spécial, une association en quelque sorte)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Price{
        private Product product;
        private Company company;
        private float unitPrice;
        ...
    }
    Une classe Product qui contient les informations sur le produit et un Set de Price
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Product{
        private int id;
        ....
        private Set<Price> prices;
        ....
    }
    Le Set est mappé comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <set name="prices" fetch="join" lazy="false">
        <key column="product_id"/>
        <one-to-many class="Price"/>
    </set>
    Lorsque je fait une requête sur les produits, j'aimerai bien qu'il me charge le set "prices" en même temps (en une seule requête).
    Mais au lieu de ça il me génère une requête pour les produits et N requêtes pour charger les prix associés.
    Quand y a 130000 produits ca gâche un peu les performances ... (une requête normale retourne dans les 500 produits, mais c'est déja très lent)

    Je rencontre le problème uniquement en utilisant l'API criteria.

    Voici un petit exemple de requête :

    Qui marche en HQL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM Product AS product JOIN FETCH product.prices AS price WHERE product.id=56688000 AND price.company.id=10022
    Qui marche pas avec l'API criteria :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Criteria productCriteria=session.createCriteria(Product.class);
    productCriteria.add(Restrictions.idEq(56688000));
    productCriteria.setFetchMode("prices", FetchMode.JOIN);
    Criteria priceCriteria=productCriteria.createCriteria("prices", JoinFragment.INNER_JOIN);
    priceCriteria.add(Restrictions.eq("company.id",10022));
    List<Product> products=(List<Product>)priceCriteria.list();
    De plus il semblerait que la condition sur company.id soit ignoréee vu qu'il me renvoie aussi des prix d'autres entreprises ...

    Une idée ?

  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
    Et un truc du genre ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Criteria productCriteria=session.createCriteria(Product.class);
    productCriteria.add(Restrictions.idEq(56688000));
    productCriteria.setFetchMode("prices", FetchMode.JOIN);
    productCriteria.createCriteria("prices").add(Restrictions.eq("company.id", 10022);
     
    List<Product> products=(List<Product>)productCriteria.list();

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2007
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    Ben non ça donne la même chose ...

Discussions similaires

  1. [Hibernate 2.1.6] Relation one-to-many
    Par GyZmoO dans le forum Hibernate
    Réponses: 0
    Dernier message: 08/09/2010, 10h44
  2. [Hibernate] Relation one to many
    Par BRAUKRIS dans le forum Hibernate
    Réponses: 2
    Dernier message: 23/08/2006, 11h51
  3. [Hibernate]Problème de requete avec "join fetch"
    Par gauloiskiki dans le forum Hibernate
    Réponses: 4
    Dernier message: 21/06/2006, 09h54
  4. [hibernate] one-to-many et clé etrangère
    Par K-Kaï dans le forum Hibernate
    Réponses: 27
    Dernier message: 18/05/2006, 10h46
  5. [hibernate] relation one-to-many avec plusieurs clés
    Par seb_fou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/03/2006, 14h47

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