Bonjour.
J'ai un soucis basique avec Hibernate lors de l'utilisation d'une requete sur plusieurs tables.
Ma première requete générée est correcte avec le filtre sur toutes les tables liées (enfants), mais par la suite, si je vais voir les objets enfants, hibernate refait une requete pour avoir la totalité des objets.
Le JAVA a été généré via hibernate generator dans eclipse, mais je en vois pas le soucis.
Exemple:
Un "Personnel" peux avoir des habilitations (table "PersonnelHabilitation"), l'habilitation est dans la table "Habilitation"
Objet Personnel:
Objet "PersonnelHabilitation"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 @Entity @Table(name = "PERSONNEL") public class Personnel implements java.io.Serializable { private Integer numpersonnel; private Set<PersonnelHabilitation> personnelHabilitations ... @OneToMany(fetch = FetchType.EAGER, mappedBy = "personnel") public Set<PersonnelHabilitation> getPersonnelHabilitations() { return this.personnelHabilitations; } }
Objet "Habilitation"
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 @Entity @Table(name = "PERSONNELHABILITATION") public class PersonnelHabilitation implements java.io.Serializable { private Habilitation habilitation; private Personnel personnel; ... @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "NUMHABILITATION") public Habilitation getHabilitation() { return this.habilitation; } @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "NUMPERSONNEL") public Personnel getPersonnel() { return this.personnel; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 @Entity @Table(name = "HABILITATION") public class Habilitation implements java.io.Serializable { private String nomhabilitation; private Set<PersonnelHabilitation> personnelHabilitations @OneToMany(fetch = FetchType.LAZY, mappedBy = "habilitation") public Set<PersonnelHabilitation> getPersonnelHabilitations() { return this.personnelHabilitations; }
Lors de ma requete pour avoir l'ensemble des salariés avec tel nom et ayant des formations dont le nom commence par 'San', je fais :
La requete est bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Criteria query = getHibernateSession().createCriteria(clazz, "personnel"); // filte sur le nom du personnel query.add(Restrictions.like("personnel.nom", personnel.getNom(),MatchMode.ANYWHERE)) //creation des alias et filtre sur le nom de la formation query.createAlias("personnel.personnelHabilitations", "personnelHabilitations"); query.createAlias("personnelHabilitations.habilitation", "habilitation"); query.add( Restrictions.not(Restrictions.like("habilitation.nomhabilitation", "San%"))); query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); return query.list();
Pourtant derrière hibernate, refait la requete suivante
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
21
22
23
24
25 select this_.NUMPERSONNEL as NUMPERSONNEL1_2_2_, this_.NOM as NOM21_2_2_, ... personnelh1_.NUMHABILITATION as NUMHABILITATION8_3_0_, personnelh1_.NUMPERSONNEL as NUMPERSONNEL9_3_0_, .... habilitati2_.NUMHABILITATION as NUMHABILITATION1_0_1_, habilitati2_.NOMHABILITATION as HABILITATION3_0_1_, from INSER.PERSONNEL this_ inner join INSER.PERSONNELHABILITATION personnelh1_ on this_.NUMPERSONNEL=personnelh1_.NUMPERSONNEL inner join INSER.HABILITATION habilitati2_ on personnelh1_.NUMHABILITATION=habilitati2_.NUMHABILITATION where ( this_.NOM like 'NOMFILTRE%' ) and habilitati2_.HABILITATION like 'San%' ;
--> Cela a pour effet de charger l'ensemble des formations de la personne ayant des formations 'San%' alors que je ne voudrais en résultats aussi que les formations filtrées de la même facon que la première requete. Pourtant, après la première requete, la requete SQL ne retourne que les formations "San%"
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 select personnelh0_.NUMPERSONNEL as NUMPERSONNEL9_2_0_, ... personnelh0_.NUMHABILITATION as NUMHABILITATION8_3_1_, ... habilitati1_.NUMHABILITATION as NUMHABILITATION1_0_2_, habilitati1_.NOMHABILITATION as HABILITATION3_0_2_, from INSER.PERSONNELHABILITATION personnelh0_ left outer join INSER.HABILITATION habilitati1_ on personnelh0_.NUMHABILITATION=habilitati1_.NUMHABILITATION where personnelh0_.NUMPERSONNEL=?
Savez vous ce que je fais mal?
Merci d'avance.
Johann
Partager