Pregunta

Trato de optimizar las consultas de bases de datos en hibernación, pero me encontré con un bloqueador:

<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 la 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 para ejecutar

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?

¿Fue útil?

Solución

  

¿Por qué? Sería mejor para correr ...

Eso no es necesariamente cierto, y de hecho depende en gran medida de la forma en su base de datos optimiza sus consultas. En términos generales, uniéndose interior será más eficiente, ya que tiene la oportunidad de reducir en gran medida el alcance de la búsqueda. Por supuesto, con una mesa de tipo simple, con sólo un par de docenas de filas que parece un exceso. Añadir un par de millones de filas y verá la diferencia.

Por una razón similar, por lo general es óptimo para añadir cualquier sugerencias de consulta que pueda a uniones. Por ejemplo (reescritura de la consulta en HQL):

from AR_SUPPORTED_LANG inner join ctry c where c.cd_id=?

... tiene que ser ...

from AR_SUPPORTED_LANG inner join ctry c WITH c.cd_id=?

La cláusula WITH es un método HQL-específica de la adición y cláusulas a JOIN declaraciones.

Otros consejos

Trate de establecer explícitamente el modo de captar para sus requisitos:

crit.setFetchMode("Country", FetchMode.SELECT);

Creo que se puede puntear ella. Debe aplicar los eq directamente sobre el objeto País:

Criteria crit = m_Session.createCriteria(SupportedLanguageVO.class);
crit.add(Restrictions.eq("Country", p_country));
crit.addOrder(Order.asc("OrderSeq"));

De este modo, si recuerdo bien, Hibernate debe optimizar la consulta de la manera deseada. Pero eso significa que necesita el objeto país, no sólo el código de país.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top