trato de optimizar las consultas de bases de datos en hibernación, pero he encontrado un bloqueador:Hibernate - Evitar innecesarias unirse al utilizar la clave externa en la cláusula where
<class name="SupportedLanguageVO" table="AR_SUPPORTED_LANG" >
<cache usage="read-only"/>
<id name="Id" type="java.math.BigInteger">
<column name="ID" sql-type="NUMBER(20)" not-null="true"/>
<generator class="assigned"/>
</id>
<property name="OrderSeq" type="java.math.BigInteger">
<column name="ORDER_SEQ" sql-type="NUMBER(20)" not-null="true"/>
</property>
<many-to-one name="Country" class="CountryVO" column="CTRY_CD_ID" cascade="none" >
<many-to-one name="Language" class="LanguageVO" column="LANG_CD" cascade="none" >
</class>
La clave principal del país es el CTRY_CD_ID
. Si me quedo con los siguientes requisitos
Criteria crit = m_Session.createCriteria(SupportedLanguageVO.class);
crit.createCriteria("Country").add(Restrictions.eq("_CountryCode", p_countrycode));
crit.addOrder(Order.asc("OrderSeq"));
puedo ver, que se une a la hibernación ctry y las mesas AR_SUPPORTED_LANG. ¿Por qué? Sería mejor correr
select * from AR_SUPPORTED_LANG where ctry_cd_id=?
SQL en lugar de
select * from AR_SUPPORTED_LANG inner join ctry .... where ctry_cd_id=?
¿Puedo forzar a Hibernate para ejecutar la primera consulta?
Desafortunadamente no tengo el objeto, solo el código de país :-( – HamoriZ
¿Es el código de país el id de la tabla de país? Si lo es, hibernate no le importaría si construye el objeto a mano sin cargarlo desde el db, siempre y cuando llene el campo id (como por ejemplo: crit.add (Restrictions.eq ("Country", new CountryVO (p_country_code)));) – Thierry