-->
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: Criteria Exemple ne prend pas en compte les ID [Résolu]
PostPosted: Tue Nov 04, 2008 8:18 am 
Newbie

Joined: Tue Nov 04, 2008 7:58 am
Posts: 6
Hibernate version: 3.00
Mapping documents: 3.00
Name and version of the database you are using: Oracle 9g


Bonjour à tous.

Je suis depuis peu sur un projet qui mélange Hibernate et Criteria.

Après m'être documenté sur ce dernier que je rencontre pour la première fois, je me suis penché sur un bug que je ne sais pas résoudre tant il est surprenant.

En simplifiant :

j'ai une table TRUC avec 3 champs
ID (string)
NOM (string)
BOOL (boolean)

et l'équivalent en objet java via le mapping hibernate

objet TRUC avec 3 paramètres : [...] + getter/setter [...]

Le but du programme est de permettre une recherche multicritère, d'ou la nécessite de prendre Criteria.

Je précise que "apparement" le mapping hibernate fonctionne bien

pour utiliser Criteria j'ai donc testé la chose suivante

Code:
TRUC truc = new TRUC(); //initialise en même temps les 3 propriété de l'objet à null
truc.nom = "azerty";
[...]

et un peu plus loin
Code:
[...]
Example example = Example.create(instance classe TRUC);
Criteria criteres = HibernateUtil.currentSession().createCriteria(modeleClassTRUC);
criteres.add(example);
return criteres.list();


Retournons maintenant côté bdd. voici ce que je peux avoir

Code:
ID..........NOM.............BOOL
11/11.......titi................true
11/12.......tata..............true
11/13.......toto..............true
12/11.......azerty...........true
12/12.......azerty...........false
12/13.......fifi................false
13/11.......riri................false
13/12.......loulou...........false
13/13.......maria...........false


Mon code devrait en théorie me retourner 2 elements :
    12/11.......azerty...........true
    12/12.......azerty...........false

ce qu'il fait avec succès.

Si je code :

TRUC truc = new TRUC();
truc.nom = "azerty";
truc.bool = true;

il me retourne bien uniquement
    12/11.......azerty...........true

Si je code
TRUC truc = new TRUC();
truc.nom = "azerty";
truc.bool = true;
truc.id = "12/11";


il me retourne toujours bien uniquement
    12/11.......azerty...........true


mais à ce moment les choses se gatent .

Si je code
TRUC truc = new TRUC();
truc.nom = "azerty";
truc.bool = true;
truc.id = "XXXXXXXXXX";

il me retourne toujours
    12/11.......azerty...........true



Si je code
TRUC truc = new TRUC();
truc.id = "XXXXXXXXXX";

il me retourne tous les enregistrements !!

bref la propriété id n'est absolument pas prise en compte -_-'

Avez vous déjà eu/vu un tel phénomène ? sans pour autant donner la solution ultime, savez vous ou dans le code je peux chercher une raison de cette réaction ?

merci d'avance de votre aide.

Cordialement, Bess


Last edited by bess on Wed Nov 05, 2008 4:21 am, edited 1 time in total.

Top
 Profile  
 
 Post subject:
PostPosted: Tue Nov 04, 2008 2:14 pm 
Beginner
Beginner

Joined: Thu Jun 30, 2005 1:04 pm
Posts: 26
Le example des criteria ne prend pas en compte l'identifiant. Ni la version et les associations d'ailleurs.

Voir http://www.hibernate.org/hib_docs/v3/re ... a-examples

Je cherche aussi une solution au même besoin de prendre de temps en temps en compte une partie de la clé, quand celle ci à une signification.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Nov 05, 2008 4:12 am 
Newbie

Joined: Tue Nov 04, 2008 7:58 am
Posts: 6
ce que l'on redoutait...

ca c'est vraiment pas une bonne nouvelle dès le matin comme ça... -_-'

Enfin bon au moins nous savons désormais qu'il nous faut abandonner cette solution et retourner à du HQL pur (ou du Criteria pur)

Merci beaucoup Francky pour ta réponse :) et si quelqu'un à trouvé une parade (en dehors de ré-écrire la base de données pour passer l'ID en champs normal et ajouter une nouvelle colonne ID) qu'il n'hésite pas, je suis preneur.

Cordialement, Bess


Top
 Profile  
 
 Post subject:
PostPosted: Wed Nov 05, 2008 5:01 am 
Beginner
Beginner

Joined: Thu Jun 30, 2005 1:04 pm
Posts: 26
Ne jetes pas si vite les Criteria.
Tu peux toujours ajouter une Restrictions.eq() ou Restrictions.like() sur ton id au criteria
C'est ce que je compte faire, ne trouvant pas de solutions plus intégrées


Top
 Profile  
 
 Post subject:
PostPosted: Wed Nov 05, 2008 5:36 am 
Newbie

Joined: Tue Nov 04, 2008 7:58 am
Posts: 6
oui on viens d'en discuter à l'instant et l'idée de taper sur la bdd ressort de notre discussion.

Voilà ce que j'ai proposé :

Changer les tables incriminées (celle n'ayant pas un véritable identifiant auto-incrémenté) afin de passer leur actuel identifiant en simple colonne. Leur rajouter une colonne identifiant + séquence associée.

Changer les mapping d'hibernate afin de répercuter cette modification.

Normalement ce sont les plus gros changement que nous aurons a faire sur la partie DAO du programme. surtout que rien n'est en prod et que les données en base sont des jeux de test supprimable

Ce sera long et provoquera à coup sur des régressions mais ce sera du temps de gagné comparé à la ré-écriture de toute la partie DAO en HQL.

De toute façon on doit encore y réfléchir mais je viendrais mettre à jour cette conversation afin de donner la suite des évènements. Si nous nous sommes fais avoir, je suis certain que d'autre seront bien content d'avoir une réponse à ce genre de problème rencontré.

Merci encore Francky et reste dans le coin ;)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 07, 2008 9:54 am 
Newbie

Joined: Tue Nov 04, 2008 7:58 am
Posts: 6
les news : il a été décidé comme on pouvait s'y attendre que l'on ne recodera pas tout en HQL au vu des nouvelles apportés par Francky.

On garde Criteria Exemple mais on refond les quelques tables de la base de donnée qui n'avaient pas d'ID auto-incrémenté classique

+modif mapping hibernate
+modif code couche DAO
+ suppression des valeurs par défaut créés automatiquement dans la couche DAO qui nous pourrissaient la création puis la recherche de Criteria par Exemple.

Voilà. Avis à ceux qui seront un jour amené à se poser la question :)


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.