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 :

filtre sur les objets associés


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut filtre sur les objets associés
    Bonjour,

    J'ai un objet TemplateValue associé par un many-to-many à des objets Template1Value. Lorsque je filtre TemplateValue par une propriété de Template1Value, j'obtiens bien la liste désirée mais lorsque j'accède à la sous liste Template1Value, aucun filtre n'est appliqué. Comment peut-on faire ce filtre ?

    TemplateValue.hbm.xml
    <class name="TemplateValue" table="TEMPLATE" >
    <id name="id" column="ID">
    <generator class="increment"/>
    </id>
    <property name="title"/>

    <set name="templates1" table="TEMPLATE_TEMPLATE1" lazy="false" >
    <key column="TEMPLATE_ID"/>
    <many-to-many column="TEMPLATE1_ID" class="Template1Value"/>
    </set>
    </class>

    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
    Criteria criteria = this.session.createCriteria(TemplateValue.class);
    Criteria criteriaTemplate1 = criteria.createAlias("templates1", "t1");
    criteriaTemplate1.add( Restrictions.like( "t1.title", "toto"));
    List list = criteria.list();
    //mes objets template sont bien filtrés
    for (int i=0;i<list.size();i++){
    TemplateValue templateValue = (TemplateValue) list.get(i);
    log.debug("id:"+templateValue.getId());
    log.debug("title:"+templateValue.getTitle());
    
    
    
    Iterator it=templateValue.getTemplates1().iterator();
    //mon itérator n'a pas filtré mes templates1
    while (it.hasNext()){
    Template1Value template1Value = (Template1Value) it.next();
    log.debug("\t id:"+template1Value.getId());
    log.debug("\t title:"+template1Value.getTitle());
    }
    }

    Même en utilisant lazy="false" rien à faire.

    Quelqu'un a une idée ?

    MERCI

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 25
    Points : 29
    Points
    29
    Par défaut
    En fait, j'ai l'impression que ta requête te ramène les TemplateValue dont l'un des TemplateValue1 au moins a son titre à "toto".

    Par conséquent dans ton résultat, tu peux très bien avoir un TemplateValue dont l'un des éléments seulement de la collection templates1 correspond à tes critères.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    En fait, j'ai l'impression que ta requête te ramène les TemplateValue dont l'un des TemplateValue1 au moins a son titre à "toto".
    C'est tout à fait ça.
    Par conséquent dans ton résultat, tu peux très bien avoir un TemplateValue dont l'un des éléments seulement de la collection templates1 correspond à tes critères.
    Mais aucun filtre n'est appliqué, je peux donc avoir des éléments de templates1 dont le titre ne correspond pas du tout à mes critères de recherche.

    Merci de ta réponse.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 25
    Points : 29
    Points
    29
    Par défaut
    Je ne suis pas sure qu'on se soit compris !

    Alors je donne un exemple :
    Imaginons que tu aies un TemplateValue a.
    a est lié à 2 TemplateValue1 :
    -b avec title = "toto"
    -c avec title = "titi"

    Si on lance ta requête, cela va ramener a car celui-ci a un templateValue1 avec un title = "toto" (c'est b)
    Le résultat de cette requête c'est donc l'objet a. a étant lié à b et c, et comme ton code affiche toute la collection templates1, il va aussi afficher c même si celui-ci n'a pas le titre toto.

    Hibernate ne peut ramener a et et modifier la collection templates1 à partir d'une simple requête select. L'objet a loadé est fidèle à son image dans la base de données.

    N'hésite pas à me dire si je n'ai pas bien compris ton problème!

  5. #5
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Tes arguments de requête servent pour la constitution de la liste des objets "TemplateValue", ils n'interviennent pas dans la constitution des collections propres à l'objet (ça, c'est hibernate qui le gère automatiquement)

    A+

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    oui cris9, c'est tout à fait ça. pour extraire une sous liste de a ne contenant que b, je suis donc obligé de refaire un appelle hibernate qui va refaire une requête en base.
    Alors qu'à la main en une requête on peut avoir tous les éléments.

    Existe-t-il une pratique intéressante pour ce genre d'utilisation ? Peut on lui dire de ramener plusieurs types de classe en même temps ? (j'en doute fortement).

    MERCI cris9 pour tes réponses, et merci OButterlin n'ayant pas de réponses j'étais arrivé à une conclusion similaire, ton message vient donc renforcer mes conclusions.

  7. #7
    zag
    zag est déconnecté
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 58
    Points : 75
    Points
    75
    Par défaut
    slt,

    si tu veux que ta collection associée templates1 soit filtrée, il te suffit de définir un filtre. Tu peux procéder ainsi :

    dans ton mapping :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <set name="templates1" table="TEMPLATE_TEMPLATE1" lazy="false" >
    <key column="TEMPLATE_ID"/>
    <many-to-many column="TEMPLATE1_ID" class="Template1Value"/>
    <filter name="titleFilter" condition="TEMPLATE1_TITLE :=title"/>
    </set>
    <filter-def name="titleFilter">
       <filter-param name="title" type="string"/>
    </filter-def>
    dans ta requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Criteria criteria = this.session.createCriteria(TemplateValue.class);
    Criteria criteriaTemplate1 = criteria.createAlias("templates1", "t1");
    criteriaTemplate1.add( Restrictions.like( "t1.title", "toto"));
    this.session.enableFilter("titleFilter").setParameterList("title","toto");
    List list = criteria.list();
    tu remarqueras que dans ta condition c'est le champs sql que tu dois utiliser, pas l'attribut de ta classe template1.

    en espérant que ca puisse t'aider,

    a+

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/12/2005, 00h40
  2. question sur les objets
    Par afrikha dans le forum Langage
    Réponses: 14
    Dernier message: 07/12/2005, 15h21
  3. Filtre sur les données des 3 derniers mois?
    Par Arkalys dans le forum Access
    Réponses: 2
    Dernier message: 21/10/2005, 09h02
  4. Réponses: 5
    Dernier message: 24/04/2005, 04h09
  5. question de débutant sur les objets
    Par boucher_emilie dans le forum ASP
    Réponses: 3
    Dernier message: 06/08/2004, 10h51

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