當我使用單個查詢運行以下代碼以獲取產品的3個集合時:價格表,材料和顏色。 當product.PriceList訪問集合,我有數據Nhibernate - eager fetchmode,outer join - 用於收集的訂單子句導致第二個不必要的查詢
ProductDTO Product = (ProductDTO)session.CreateCriteria(typeof(ProductDTO))
.Add(Expression.IdEq(code))
.SetFetchMode("Colors", FetchMode.Eager)
.SetFetchMode("PriceList", FetchMode.Eager)
.SetFetchMode("Materials", FetchMode.Eager)
.UniqueResult();
的問題是,我需要列出集合價目表,以便通過Num和我使用下面的代碼:
ProductDTO Product = (ProductDTO)session.CreateCriteria(typeof(ProductDTO))
.Add(Expression.IdEq(code))
.SetFetchMode("Colors", FetchMode.Eager)
.SetFetchMode("PriceList", FetchMode.Eager)
.SetFetchMode("Materials", FetchMode.Eager)
.UniqueResult();
或明年代碼:
ProductDTO Product = (ProductDTO)session.CreateCriteria(typeof(ProductDTO))
.Add(Expression.IdEq(code))
.SetFetchMode("Colors", FetchMode.Eager)
.SetFetchMode("PriceList", FetchMode.Eager)
.SetFetchMode("Materials", FetchMode.Eager)
.CreateCriteria("PriceList").AddOrder(Order.Asc("Num"))
.UniqueResult();
這一限制意味着,當我訪問集合product.PriceList強制執行新查詢價目表(不與秩序條款)是是不必要的。 我偶爾會「無法初始化懶洋洋地收集角色沒有會話或會話已關閉」
請如果有人能指導我一下。我喜歡在單個查詢中解決並理解發生了什麼。 我發現像使用「not-found = ignore」的類似帖子。我使用NHibernate 2.1.2
我下重現映射的一部分:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DotAR.M.Logica.DTO.ProductDTO, DotAR.M" table="products">
<id name="Code" type="string" unsaved-value="null">
<generator class="assigned" />
</id>
<set name="PriceList" lazy="true" inverse="true" cascade="all">
<key column="code" />
<one-to-many class="DotAR.M.Logica.DTO.ProductPriceNumDTO, DotAR.M" />
</set>
<set name="Colors" lazy="true" inverse="true" cascade="all">
<key column="code" />
<one-to-many class="DotAR.M.Logica.DTO.ProductColorDTO, DotAR.M" />
</set>
<set name="Materials" lazy="true" inverse="true" cascade="all">
<key column="code" />
<one-to-many class="DotAR.M.Logica.DTO.ProductMaterialDTO, DotAR.M" />
</set>
</class>
</hibernate-mapping>
每個集合具有複合-ID。實施例ProductColor
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="DotAR.M.Logica.DTO.ProductColorDTO, DotAR.M" table="product_colors">
<composite-id unsaved-value="any">
<key-property name="Code" type="string" />
<key-property name="Name" type="string" />
</composite-id>
<many-to-one name="Product" column="code" class="DotAR.M.Logic.DTO.ProductDTO, DotAR.M" insert="false" update="false" />
</class>
</hibernate-mapping>