Ham*_*riZ 5 sql hibernate fetch hibernate-mapping
我尝试在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>
Run Code Online (Sandbox Code Playgroud)
国家的主要关键是CTRY_CD_ID.如果我运行以下标准
Criteria crit = m_Session.createCriteria(SupportedLanguageVO.class);
crit.createCriteria("Country").add(Restrictions.eq("_CountryCode", p_countrycode));
crit.addOrder(Order.asc("OrderSeq"));
Run Code Online (Sandbox Code Playgroud)
我可以看到,hibernate加入了ctry和AR_SUPPORTED_LANG表.为什么?跑步会更好
select * from AR_SUPPORTED_LANG where ctry_cd_id=?
Run Code Online (Sandbox Code Playgroud)
sql而不是
select * from AR_SUPPORTED_LANG inner join ctry .... where ctry_cd_id=?
Run Code Online (Sandbox Code Playgroud)
我可以强制hibernate运行第一个查询吗?
小智 1
为什么?最好是跑...
这不一定是真的,事实上很大程度上取决于数据库如何优化其查询。一般来说,内连接会更有效,因为它有机会大大缩小搜索范围。当然,对于只有几十行的简单类型表来说,这看起来有点大材小用。添加几百万行,您就会看到差异。
出于类似的原因,通常最好将任何可以添加到连接的查询提示添加到连接中。例如(用 HQL 重写查询):
from AR_SUPPORTED_LANG inner join ctry c where c.cd_id=?
Run Code Online (Sandbox Code Playgroud)
...应该...
from AR_SUPPORTED_LANG inner join ctry c WITH c.cd_id=?
Run Code Online (Sandbox Code Playgroud)
WITH 子句是 HQL 特定的方法,用于将 AND 子句添加到 JOIN 语句。
| 归档时间: |
|
| 查看次数: |
3077 次 |
| 最近记录: |