Domanda

Io cerco di ottimizzare le query di database in Hibernate, ma ho trovato un bloccante:

<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 chiave primaria del Paese è la CTRY_CD_ID. Se corro i seguenti criteri

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

Posso vedere, che si unisce al hibernate CTRY e le tabelle AR_SUPPORTED_LANG. Perché? Sarebbe meglio per eseguire

select * from AR_SUPPORTED_LANG where ctry_cd_id=?

SQL piuttosto che

select * from AR_SUPPORTED_LANG inner join ctry .... where ctry_cd_id=?

Posso forzare hibernate per eseguire la prima query?

È stato utile?

Soluzione

  

Perché? Sarebbe meglio a correre ...

Questo non è necessariamente vero, e infatti dipende fortemente da come il database consente di ottimizzare le sue domande. In generale, interna unendo sarà più efficace perché ha la possibilità di ridurre notevolmente l'ambito di ricerca. Naturalmente, con una semplice tabella tipo con solo un paio di dozzine di righe sembra eccessivo. Aggiungere un paio di milioni di righe e vedrete la differenza.

Per un motivo simile, è generalmente ottimale per aggiungere qualsiasi richiesta suggerimenti che è possibile per join. Per esempio (riscrivere la query in HQL):

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

... dovrebbe essere ...

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

La clausola WITH è un metodo HQL-specifico di aggiunta e clausole di JOIN dichiarazioni.

Altri suggerimenti

Prova esplicitamente impostare la modalità di recupero che ai vostri criteri:

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

Penso che si può dot it. Si dovrebbe applicare l'EQ direttamente sull'oggetto Paese:

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

In questo modo, se ricordo bene, ibernazione dovrebbe ottimizzare la query nel modo desiderato. Ma questo significa che è necessario l'oggetto paese, non solo il codice del paese.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top