я пытаюсь оптимизировать запросы к базе данных в спящий режим, но я нашел блокатор:Hibernate - избежать ненужных присоединиться при использовании внешнего ключа в положение, где
<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>
Первичный ключ страны является CTRY_CD_ID
. Если я запускаю следующие критерии
Criteria crit = m_Session.createCriteria(SupportedLanguageVO.class);
crit.createCriteria("Country").add(Restrictions.eq("_CountryCode", p_countrycode));
crit.addOrder(Order.asc("OrderSeq"));
Я могу видеть, что спящий режим соединяет ctry и таблицы AR_SUPPORTED_LANG. Почему? Было бы лучше, чтобы запустить
select * from AR_SUPPORTED_LANG where ctry_cd_id=?
SQL, а не
select * from AR_SUPPORTED_LANG inner join ctry .... where ctry_cd_id=?
Могу ли я принудительно спящий режим, чтобы запустить первый запрос?
К сожалению, у меня нет объекта, только код страны :-( – HamoriZ
Является ли код страны идентификационным номером таблицы страны? Если это так, спящий режим не будет возражать, если вы создадите объект вручную, не загрузив его из db, пока вы заполняете поле id (например, например: crit.add (Restrictions.eq («Страна», новый CountryVO (p_country_code)));) – Thierry