2014-01-14 29 views
2

我試圖優化我的查詢到數據庫。目前我們有這樣的映射,但它可能會在未來增長。我們正在對對象A做很多小操作,其中大多數不需要加載所有數據。在顯示UI數據的同時,我們需要一次加載所有員工。nHibernate。動態選擇需要添加到結果集的引用

我試圖添加額外的映射,但看起來這不是這裏的情況。

這裏是映射文件:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" default-lazy="false"> 
    <class name="A" table="A" discriminator-value="?" dynamic-update="true" > 

     <cache usage="nonstrict-read-write"/> 

     <id name="AId" column="aId"> 
      <generator class="guid.comb" /> 
     </id> 

     <bag name="B" table="B" inverse="true" outer-join="false" lazy="false" batch-size="50" > 
      <cache usage="nonstrict-read-write"/> 
      <key column="aId" /> 
      <one-to-many class="B" /> 
     </bag> 

     <many-to-one name="C" column="cId" class="C" outer-join="true" not-found="ignore" /> 
     <many-to-one name="D" column="dId" class="D" outer-join="true" not-found="ignore" /> 

    </class> 
</hibernate-mapping> 

是否有可能在的ICriteria指定,將只檢索疼痛對象A,或對象的任何設置內部對象B,C或d

謝謝。

回答

1

NHibernate確實有解決方案。事實上,正是這些場景是由這個ORM工具的設計所預期的。但首先請,嘗試停止使用而不是懶惰映射。

換句話說,我們必須顛倒一下。保持映射惰性,並強制查詢特設渴望。爲了得到一些想法閱讀:

下一個步驟。將所有映射更改爲lazy="true" ...或跳過它,因爲懶惰是默認設置。不要使用default-lazy =「false」。

讓所有的映射支持懶惰,我們可以在我們的查詢中覆蓋該行爲。所以實際上所有這些有A,B,C將在此查詢一個SELECT發送到數據庫引擎選擇:

var criteria = session.CreateCriteria<A>() 
    .CreateAlias("B", "b") 
    .CreateCriteria("C"); 

我們也可以指定JOIN(內,左)的類型。另請檢查NHibernate - CreateCriteria vs CreateAlias。還有更多...

這裏有一些出發點,在文檔中(類似於第16章QueryOver):

它更一旦玩(和也與one-to-many /集合)也檢查: