2011-02-24 47 views
2

在我的查詢中我使用多個表,其中一些不能設置爲正常的nhibernate關係,所以我不得不返回由單個列構成的行而不是實體的實例。一個我想回到的屬性是包/列表和我的查詢是這樣的:從HQL查詢中複製行時返回包屬性

select p.ID, p.SomeOtherField, elements(p.MappedBagField), o.AnotherField ... from Parent p, OtherClass o, ...

查詢作品,但我有問題,我找回多個行時袋包含多個鏈接的記錄。有沒有簡單的方法來阻止這種情況的發生?我試圖不同p.ID但它並沒有任何區別

[編輯]請問標準API更適合呢?[/編輯]

+0

當你刪除'elements'函數時會發生什麼? – dfb 2011-02-24 17:16:41

+0

如果我刪除元素部分,然後我會收到一個異常,說「收集附近的非法語法」後跟查詢文本。 – James 2011-02-24 17:23:04

+0

你想讓結果看起來像什麼? – 2011-02-25 00:01:01

回答

3

看起來你只是試圖得到一個加載收集的父母名單,加上來自其他實體的一些數據,這是正確的嗎?

在這種情況下:

var parents = session.CreateQuery(@" 
    select p, o 
    from Parent p, OtherClass o 
    join fetch p.MappedBagField 
    ...") 
    .SetResultTransformer(Transformers.DistinctRootEntity) 
    .List<object[]>(); 

結果的每一個項目都有兩個元素,[0]是父,[1]是OtherClass。

+0

不幸的是,正如我在我的原始問題中所說的,我還需要使用手動連接從其他一些表中檢索列。 – James 2011-02-28 09:29:44

+0

@James:編輯添加OtherClass。 – 2011-02-28 11:59:04

0

這是一個袋子的語義。一個袋子允許重複的實體。 而不是使用Bag(List),嘗試使用Set(ISet)。 NHibernate通常應該過濾出重複的東西。

0

相反的不同p.ID使用兩個截然不同的p-(不.ID場)

我有重複的結果行了同樣的問題。這解決了我的問題:

session.CreateQuery(
    "SELECT DISTINCT p, o 
    FROM ParentClass AS p, 
     OtherClass AS o 
    INNER JOIN p.mappedBagField as bagField 
    WHERE ... 
    AND bagField.id IN (:interestingIds)") 
.setParameterList("interestingIds", {1,2,3,4}); 
.list(); 

說明:

父類OtherClass是兩個不同的班級,沒有(休眠映射)關係。

ParentClass.mappedBagField是一個集合第三個 hibernate映射類。

在上面的例子我尋找與interestingIds 1,2,3和4

如果父類數據集具有兩個mappedBagField條目與IDS 2和4行,則(原始)SELECT將匹配上述interrestingIds兩次!

這導致兩行。

添加DISTINCT P到SELECT省略重複的結果:只有一次(即使有多個interestingId命中)中的每一行就會出現。