我尝试优化在休眠的数据库查询,但我发现阻断剂:

<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=?

我可以强制冬眠运行第一查询?

有帮助吗?

解决方案

  

为什么呢?这将是更好地运行......

这未必是真实的,而事实上在很大程度上取决于你的数据库如何优化它的查询。一般来说,内侧连接将更加有效,因为它有机会,极大地缩小了搜索范围。当然,只有一对夫妇十几行的简单类型的表,它看起来像矫枉过正。加入几百万行,你会看到其中的差别。

由于类似的原因,这是通常的最佳添加任何查询提示,你可以为连接。例如(重写HQL查询):

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

...应该是...

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

WITH子句是添加和条款来JOIN语句的特定HQL-方法。

其他提示

尝试明确设置为您的标准提取模式:

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

我觉得你可以点它。 你应该直接套用EQ全国对象:

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

这样的话,如果我记得不错,应该冬眠优化查询你想要的方式。但是,这意味着你需要的国家目标,不仅是国家代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top