Hibernate version: 3.0
Voici un extrait des 2 fichiers 'hbm' concernés :
utilisateur.hbm.xml :
Code:
<class name="UtilisateurVo" table="utilisateur">
...
<map name="mapInfosEmploye" table="travail_dans_sous_agence" lazy="true">
<key>
<column name="tsag_societe_uti"/>
<column name="tsag_code_personne"/>
</key>
<index-many-to-many class="fr.mdpa.referentiel.metier.agence.donnees.SousAgenceVo">
<column name="tsag_societe"/>
<column name="tsag_agt"/>
<column name="tsag_s_agt"/>
</index-many-to-many>
<composite-element class="fr.mdpa.referentiel.metier.agence.donnees.InfosEmploye">
<property name="geographique" column="tsag_geographique" type="string"/>
<property name="responsable" column="tsag_responsable" type="string"/>
<property name="production" column="tsag_production" type="string"/>
<property name="parDefaut" column="tsag_par_defaut" type="string"/>
</composite-element>
</map>
...
</class>
agence.hbm.xml :
Code:
<class name="SousAgenceVo" table="sous_agence">
...
<map name="mapInfosEmploye" table="travail_dans_sous_agence" lazy="true">
<key>
<column name="tsag_societe"/>
<column name="tsag_agt"/>
<column name="tsag_s_agt"/>
</key>
<index-many-to-many class="fr.mdpa.referentiel.metier.utilisateur.donnees.UtilisateurVo">
<column name="tsag_societe_uti"/>
<column name="tsag_code_personne"/>
</index-many-to-many>
<composite-element class="fr.mdpa.referentiel.metier.agence.donnees.InfosEmploye">
<property name="geographique" column="tsag_geographique" type="string"/>
<property name="responsable" column="tsag_responsable" type="string"/>
<property name="production" column="tsag_production" type="string"/>
<property name="parDefaut" column="tsag_par_defaut" type="string"/>
</composite-element>
</map>
...
</class>
La requête utilisée est la suivante :
Code:
select distinct new fr.mdpa.referentiel.presentation.agence.vue.SousAgencePersonnelPo( utilisateur.pk.societe.pk.codeSociete, utilisateur.pk.codePersonne, utilisateur.nom, utilisateur.prenom, mapInfo.responsable, mapInfo.parDefaut, mapInfo.production, mapInfo.geographique)
from UtilisateurVo utilisateur, SousAgenceVo sousAgence
join utilisateur.mapInfosEmploye mapInfo
where sousAgence in indices(mapInfo)
and sousAgence.pk.agenceAdministrative.pk.codeAgence = '0001'
and sousAgence.pk.codeSousAgence = 'B'
Le sql qui est généré est le suivant :
Code:
select distinct utilisateu0_.uti_societe as col_0_0_, utilisateu0_.uti_code_personne as col_1_0_, utilisateu0_.uti_nom as col_2_0_, utilisateu0_.uti_prenom as col_3_0_, mapinfosem2_.tsag_responsable as col_4_0_, mapinfosem2_.tsag_par_defaut as col_5_0_, mapinfosem2_.tsag_production as col_6_0_, mapinfosem2_.tsag_geographique as col_7_0_ from utilisateur utilisateu0_, travail_dans_sous_agence mapinfosem2_, sous_agence sousagence1_
where utilisateu0_.uti_societe=mapinfosem2_.tsag_societe_uti
and utilisateu0_.uti_code_personne=mapinfosem2_.tsag_code_personne
and ((sousagence1_.sag_societe, sousagence1_.sag_agt, sousagence1_.sag_s_agt) in (
select mapinfosem2_.tsag_societe, mapinfosem2_.tsag_agt, mapinfosem2_.tsag_s_agt
from travail_dans_sous_agence mapinfosem2_
where utilisateu0_.uti_societe=mapinfosem2_.tsag_societe_uti
and utilisateu0_.uti_code_personne=mapinfosem2_.tsag_code_personne)
)
and (sousagence1_.sag_agt = '0001')
and (sousagence1_.sag_s_agt = 'B')
Description du problème :
- si le contenu de la base de donnée est :
Code:
codeSociete codeAgence codeSousAgence codePersonne nom prenom responsable parDefaut geographique Production
soc1 0002 0 1 nom1 prenom1 1 0 N N
soc1 0001 B 1 nom1 prenom1 0 1 N O
soc1 0004 A 2 nom2 prenom2 0 1 O N
soc1 0003 A 2 nom2 prenom2 1 0 O N
soc1 0005 O 2 nom2 prenom2 1 1 O O
soc1 0001 B 2 nom2 prenom2 0 0 O N
soc1 0001 B 3 nom3 prenom3 0 1 N N
soc1 0006 0 3 nom3 prenom3 0 0 O O
soc1 0006 A 3 nom3 prenom3 0 0 N O
- le résultat de la requete ci-dessus est :
Code:
codeSociete codePersonne nom prenom responsable parDefaut geographique Production
soc1 1 nom1 prenom1 0 1 N O
soc1 1 nom1 prenom1 1 0 N N
soc1 2 nom2 prenom2 0 0 O N
soc1 2 nom2 prenom2 0 1 O N
soc1 2 nom2 prenom2 1 0 O N
soc1 2 nom2 prenom2 1 1 O O
soc1 3 nom3 prenom3 0 0 N O
soc1 3 nom3 prenom3 0 0 O O
soc1 3 nom3 prenom3 0 1 N N
- résultat souhaité :
Code:
codeSociete codePersonne nom prenom responsable parDefaut geographique Production
soc1 1 nom1 prenom1 0 1 N O
soc1 2 nom2 prenom2 0 0 O N
soc1 3 nom3 prenom3 0 1 N N
remarques :
- l'utilisateur est '1' est associé à 2 agences au total
- l'utilisateur est '2' est associé à 4 agences au total
- l'utilisateur est '3' est associé à 3 agences au total
il manque donc la jointure sur le codeSousAgence dans la requete (and mapinfosem2_.tsag_s_agt = sousagence1_.sag_s_agt).
Cependant, comment rajouter cette jointure dans la requête HQL ?
Existe-t-il une autre solution ?