These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Problème de critère
PostPosted: Wed Apr 19, 2006 11:35 am 
Newbie

Joined: Wed Apr 19, 2006 11:26 am
Posts: 4
Voici mon problème
j'ai un objet obj_a qui contient 2 ref vers un autre objet obj_b
il n'y a pas de mapping entre obj_b et obj_a pour éviter de récupérer trop de données lors du chargement de obj_b sachant que obj_b peut être réfrérencé sur la ref_1 de obj_a ou la ref_2 de obj_a (cela compliique le mapping)

J'ai des criètères sur mon objet obj_b et je voudrai rajouter une contrainte d'un proriété de obj_a (par exemple name de obj_a = "toto")

Je n'arriva pas à savoir quel objets utiliser pour monter mes nouveaux critère

j'ai vu qu'il existait des Requêtes et sous-requêtes détachées mais je n'y comprends rien du tout

Aidez moi please


Top
 Profile  
 
 Post subject:
PostPosted: Wed Apr 19, 2006 6:19 pm 
Newbie

Joined: Wed Apr 19, 2006 2:51 pm
Posts: 16
Tu peux créer des critères dynmiquement avec n'importe quel type de données, pourvu que cela ait un sens pour le mapping qui les traitera grace à l'API Criteria :

http://www.hibernate.org/hib_docs/v3/re ... g-criteria

Criteria critere = session.createCriteria(obj_2.class);
// Un objet critere est instancié pour la classe obj_2 {}

critere .add( Expression.eq( propriété1_obj_2, eg.propriete1_obj_1 ) );
// On ajoute à critere une restriction sur la propriété voulu ;

... répéter l'opération pour toutes les propriétés ;

critere.List();
//exécution de la requête d'extraction en appliquant les critères;

_________________
Cheers,
Laurent

Thanks for rating in case it helped !


Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 20, 2006 4:00 am 
Newbie

Joined: Wed Apr 19, 2006 11:26 am
Posts: 4
Merci mais voici mon code et je ne sais comment rajouter les critères de obj_1, sachant qu'il n'y a pas de mapping de obj_2 vers obj_1 mais seulement de obj_1(ref_obj_2_id_1) vers obj_2 et obj_1(ref_obj_2_id_2) vers obj_2
Peut-on ajouter un mapping sur obj_2 vers ref_obj_2_id_1 ou ref_obj_2_id_2 de obj_1 ?

Session sess = HibernateSessionFactory.currentSession(this);
Criteria critObj_2 = sess.createCriteria(AbstractPlmObj_2.class);
this.addToCriteria(critObj_2, crit_obj_2_id, OBJ_1.ID);
this.addToCriteria(critObj_2, crit_obj_2_prop_1, OBJ_1.PROP_1);
...
if (crit_obj_1_prop_1 != null && crit_obj_1_prop_1.isRenseigne()) {
// code à rajouter pour rajouter les critères de obj_1
}

mapping obj_1
<class name="Obj_1" table="OBJ_1" schema="BASE">
<id name="id" type="long">
<column name="ID" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">OBJ_1_SEQ</param>
</generator>
</id>
<property name="prop_1" type="string">
<column name="PROP_1" length="n" />
</property>
...
<many-to-one name="ref_obj_2_id_1" column="REF_OBJ_2_ID_1" class="Obj_2" outer-join="true" />
<many-to-one name="ref_obj_2_id_2" column="REF_OBJ_2_ID_2" class="Obj_2" outer-join="true" />
</class>

mapping obj_2
<class name="Obj_2" table="OBJ_2" schema="BASE">
<id name="id" type="long">
<column name="ID" precision="22" scale="0" />
<generator class="sequence">
<param name="sequence">OBJ_2_SEQ</param>
</generator>
</id>

<property name="prop_1" type="string">
<column name="PROP_1" length="n" />
</property>
...
</class>


Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 20, 2006 8:56 am 
Newbie

Joined: Wed Apr 19, 2006 11:26 am
Posts: 4
J'ai en partie résolu mon problème même si la solution ne me plait guêre
Voici ce que j'ai ajouté dans mon mapping
<set name="ref_obj_2_id_1" lazy="true" table="OBJ_1">
<key column="REF_OBJ_2_ID_1" />
<one-to-many class="class_obj_1"/>
</set>
<set name="ref_obj_2_id_2" lazy="true" table="OBJ_1">
<key column="REF_OBJ_2_ID_2" />
<one-to-many class="class_obj_1"/>
</set>

Mais maintenant quand je lance un critère sur obj_1 et qu'il y a 3 obj_1 qui référence 1 obj_2, le résultat me renvoie 3 fois obj_2, car le mapping crée une requete avec touts les champs, ce qui fait qu'hibernate ne peut renvoyer qu'une seule ligne

Peut-on rajouter un option sur les critères qui dit à hibernate de ne retourner que l'objet final sans doublon ?


Top
 Profile  
 
 Post subject:
PostPosted: Thu Apr 20, 2006 3:47 pm 
Newbie

Joined: Wed Apr 19, 2006 2:51 pm
Posts: 16
Il y a en effet une fonction HQL GROUP BY qui permet cela :

http://www.hibernate.org/hib_docs/v3/re ... l-grouping


Je ne peux pas t'en dire plus que je ne l'ai pas mise en oeuvre jusqu là ! Mais ton problème me semble un classique du requêtage SQL que j'ai l'habitude de résoudre par une clause GROUP BY.

_________________
Cheers,
Laurent

Thanks for rating in case it helped !


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 21, 2006 10:09 am 
Newbie

Joined: Wed Apr 19, 2006 11:26 am
Posts: 4
J'ai vue qu'il existe Projections.groupProperty qui permet des simuler un group by, mais le problème et que hibernate au lieu de merenvoyer une collection d'obj_2, me renvoie une collection de lignes de la table de l'obj_2.
Il faut donc recontruite tous les lignes récupérée en objet.
Peut-on sauter cette étape et regrouper directement par mon obj_2 mapper dans hibernate ?


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.