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.  [ 3 posts ] 
Author Message
 Post subject: exclure des champs du select
PostPosted: Fri Jan 05, 2007 2:32 pm 
Newbie

Joined: Fri Jan 05, 2007 1:47 pm
Posts: 7
Bonjour à tous,

Je suis dans un phase d'amélioration des perfs de mon appli, et j'essaye donc d'améliorer les requêtes générées par Hibernate. Dans mon cas, j'ai un object LBContact qui contient un object Contact. Je dois récupérer la liste des LBContacts, et afficher quelques attributs du Contact contenu. En l'occurence, je n'ai pas besoin de l'adresse du Contact (mappée en tant que component, voir fichier de mapping ci-dessous). Malheureusement et malgré un lazy=false sur l'adresse, je n'arrive pas exclure les champs composant l'adresse du select. Vu que j'ai plusieurs milliers d'éléments à retouner, je devrais pouvoir économiser de la bande passante si la base de données ne me renvoie pas les adresses.

merci d'avance à quiconque aura une idée.

Bon week-end

--
Vincent

Hibernate version:
3.1.3
Mapping documents (simplifiés):
Code:
<class name="LBcontact" table="LB2_LB">
 
  <cache usage="read-write"/>
 
   <id name="id"
      column="LB_ID"
      type="long">
      <generator class="native"/>
   </id>
   
   <many-to-one name="contact"
             class="myPackage.common.Contact"
             column="LB_CONTACT_ID"
             unique="true"
             cascade="merge,save-update"
             not-null="true"
             lazy="false"
   />

</class>

<class name="Contact" table="T_SYN_CONTACT">
 
    <cache usage="read-write"/>
 
      <id
         name="id"
         column="CONTACT_ID"
         type="long">
        <generator class="sequence">
                <param name="sequence">S_SYN_CONTACT</param>
        </generator>
      </id>
      
      <property
         name="login"
         column="CONTACT_LOGIN"
         type="string"
         unique="true"
         not-null="true">
      </property>
               
      <property
         name="firstName"
         column="CONTACT_FIRST_NAME"
         type="string">
      </property>
      
      <property
         name="lastName"
         column="CONTACT_LAST_NAME"
         type="string">
      </property>   

      
      
      <component name="internalAddress" class="Address" lazy="false">
         <property name="line1"
            type="string"
            column="CONTACT_ADDRESS_LINE1">
         </property>
         <property name="line2"
            type="string"
            column="CONTACT_ADDRESS_LINE2">
         </property>
         <property name="city"
            type="string"
            column="CONTACT_ADDRESS_CITY">
         </property>
         <property name="areaCode"
            type="string"
            column="CONTACT_ADDRESS_AREA_CODE">
         </property>
      </component>   
      
      <many-to-one
         name="company"
         column="CONTACT_COMPANY"
         class="Company"
         not-null="true" lazy="false" />

      <many-to-one
         name="country"
         column="CONTACT_COUNTRY"
         class="Country"
         not-null="true" lazy="false" />
            
  </class>

Code between sessionFactory.openSession() and session.close():
Code:
Criteria req= hibernateTemplate.getSessionFactory().getCurrentSession().createCriteria(LBContact.class)
                                                            .createAlias("contact","cont")
                                                            .createAlias("cont.company","comp")
                                                            .createAlias("cont.country","count")
                                                            .setFetchMode("contact",FetchMode.JOIN)



Name and version of the database you are using:
Oracle
The generated SQL (show_sql=true):
Code:
select this_.LBCONTACT_ID as LB1_16_3_,
this_.LBCONTACT_FIRST_LOGIN as LB2_16_3_,
this_.LBCONTACT_PROFILE as LB3_16_3_,
this_.LBCONTACT_CONTACT_ID as LB4_16_3_,
this_.LBCONTACT_GROUP_ID as LB5_16_3_,
cont1_.CONTACT_ID as CONTACT1_6_0_,
cont1_.CONTACT_LOGIN as CONTACT2_6_0_,
cont1_.CONTACT_IS_EXTERNAL as CONTACT3_6_0_,
cont1_.CONTACT_FIRST_NAME as CONTACT4_6_0_,
cont1_.CONTACT_LAST_NAME as CONTACT5_6_0_,
cont1_.CONTACT_PHONE_NUMBER as CONTACT6_6_0_,
cont1_.CONTACT_FAX_NUMBER as CONTACT7_6_0_,
cont1_.CONTACT_EMAIL as CONTACT8_6_0_,
cont1_.CONTACT_ADDRESS_LINE1 as CONTACT9_6_0_,
cont1_.CONTACT_ADDRESS_LINE2 as CONTACT10_6_0_,
cont1_.CONTACT_ADDRESS_CITY as CONTACT11_6_0_,
cont1_.CONTACT_ADDRESS_AREA_CODE as CONTACT12_6_0_,
cont1_.CONTACT_COMPANY as CONTACT13_6_0_,
cont1_.CONTACT_COUNTRY as CONTACT14_6_0_,
comp2_.COMPANY_ID as COMPANY1_5_1_,
comp2_.COMPANY_NAME as COMPANY2_5_1_,
comp2_.COMPANY_TYPE as COMPANY4_5_1_,
comp2_.COMPANY_SECTOR as COMPANY5_5_1_,
count3_.COUNTRY_ID as COUNTRY1_7_2_,
count3_.COUNTRY_NAME as COUNTRY2_7_2_,
count3_.COUNTRY_ZONE as COUNTRY3_7_2_
from LB2_LBCONTACT this_ inner join T_SYN_CONTACT cont1_ on this_.LBCONTACT_CONTACT_ID=cont1_.CONTACT_ID
inner join T_SYN_COMPANY comp2_ on cont1_.CONTACT_COMPANY=comp2_.COMPANY_ID
inner join T_SYN_COUNTRY count3_ on cont1_.CONTACT_COUNTRY=count3_.COUNTRY_ID


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 05, 2007 5:20 pm 
Expert
Expert

Joined: Tue Dec 28, 2004 7:02 am
Posts: 573
Location: Toulouse, France
À mon avis, tu perds ton temps. Je suis très sceptique quant au fait que supprimer la récupération de quatre champs parmi une dizaine te permette d'améliorer les perfs.

Toutefois, si tu tiens à vérifier, je ne suis pas sûr qu'il soit possible de façon standard d'exclure des propriétés. Par contre, tu peux faire une projection de ceux que tu veux conserver.

_________________
Baptiste
PS : please don't forget to give credits below if you found this answer useful :)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 05, 2007 6:07 pm 
Newbie

Joined: Fri Jan 05, 2007 1:47 pm
Posts: 7
Salut Batmat,

En fait, c'est autant pour le "sport" que pour les perfs que je cherche à faire ça.
J'ai essayé en passant par une projection, mais j'ai laissé tomber, car je retombais dans les problèmes des n+1 requêtes. Je ne suis peut être pas allé au bout, je ne sais pas, je ré-essaierai à l'occasion.

merci pour ta réponse en tous cas

--
Vincent


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 3 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.