-->
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.  [ 1 post ] 
Author Message
 Post subject: problème avec une reqûete en HQL qui utilise un 'map'
PostPosted: Wed Feb 22, 2006 11:28 am 
Newbie

Joined: Wed Feb 22, 2006 10:27 am
Posts: 1
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 ?


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

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.