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