2011-05-04 51 views
0

我具有以下類SQL別名字典返回重複結果

<class name="Product" table="Product"> 
<id name="ID" /> 
... 
<map name="CustomFields" table="CustomFieldView"> 
    <key column="RECORDID" /> 
    <map-key column="CFName" type="String" /> 
    <element column="CFValue" type="String" /> 
</map> 
</class> 

和SP來選擇產品與CustomFields字典

<sql-query name="GetProducts"> 
     <return alias="p" class="Product" /> 
     <return-join alias="cf" property="p.CustomFields" /> 

     SELECT {p.*}, {cf.*} 

     FROM Product p 
      INNER JOIN CustomFieldView cf ON p.ID = cf.RECORDID 

     // WHERE 
    </sql-query> 

當我選擇單品等WHERE ID = 1234,然後它按預期工作 - 返回一個包含填充的CustomFields Dictionary屬性的產品。 但是,當我選擇不是單個產品時,如WHERE ID IN(18780,21642)或其他條件,則我獲得產品重複'CustomFields.Count'次,例如, 2個產品,每個產品有20個自定義字段,然後是40個產品,每個有20個有效的自定義字段。

我在映射中遺漏了什麼嗎?

回答

0

您正在退回Cartesian product,因此您的產品將每個自定義字段返回x次。

爲了解決這個問題,你需要使用類似: -

var query = Session 
    .GetNamedQuery("GetProducts") 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()); 
    return query.List<Product>(); 

請注意,您將發送的所有數據沿着電線和NHibernate將執行不同的變壓器客戶(意味着Web服務器或桌面應用)方面。

我不是100%確定如果返回連接將被填充,因爲我從來沒有這樣做過,你需要測試這個。

編輯 我覺得你提取策略不太對。你真的需要一個< sql-query ...>你可以使用另一種策略,例如HQL

+0

但是這種映射可以很好地與例如,目前只有的問題。這對我來說很麻煩,我正在尋找更自然的解決方案。無論如何,非常感謝! – Madman 2011-05-04 11:03:13

+0

對不起,我錯誤理解你的問題。不過,我認爲你提取策略並不完全正確。你真的需要一個' Rippo 2011-05-04 11:10:06

+0

你理解我很對。也許更改爲HQL將有所幫助...我將回來測試結果。謝謝 – Madman 2011-05-04 11:13:11