2009-12-07 81 views
0

更新:我已經在下面回答我的問題,採取偷看,讓我知道,如果你有這樣NHibernate的SQL查詢結果導致


執行的更好的方法總結:
當從SQL Management Studio中調用我的sqlserver函數時,我得到一個包含結果{1,2,3}的列表。當使用NHibernate從代碼調用方法時,我得到這個列表{1,1,1}。 ('1'是整個結果行,而不是標量'1') 我也嘗試過使用不同的數據集,並得到相同的行爲。

長篇小說:
我在sql server中有一個sql函數,名爲GetHistory(itemId)。它會返回一個包含結果的表格。 當我從SQL Management Studio中查詢時,我得到了一個結果列表。我查詢通過調用函數像這樣:

select * from GetHistory(10001)

我給DB這導致3行。每一行都有一個時間,類型和描述。
在NHibernate中,我特別爲此創建了一個新實體,因爲沒有這樣的有機表/實體。 所以我有一個映射:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
namespace="myNamespace" assembly="myAssembly"> 
<class name="HistoryEvent"> 
<id name="id" type="long" access="field"> 
    <column name="Id"/> 
    <generator class="native"/> 
</id> 
<property name="type" column="Type" type="short" access="field"/> 
<property name="time" column="Time" type="datetime" access="field"/> 
<property name="description" column="Description" type="string" access="field"/> 
</class> 

<sql-query name='GetHistory'> 
    <return class='HistoryEvent, myAssembly' alias='historyEvent'/> 
<![CDATA[SELECT * FROM GetHistory(:id)]]> 
</sql-query> 
</hibernate-mapping> 

業務對象是這樣的:

public class HistoryEvent 
{ 
    private long id; 
    private short type; 
    private string description; 
    private DateTime time; 
     ... here be properties with public getter etc... 
    } 

最後,我把從我的代碼這個功能就像這樣:檢查時

IList result = s.GetNamedQuery("GetHistory").SetInt64("id", id).List(); 

這個列表與調試器我得到3個實體是同一行3次。 我也試過直接從NHibernate使用查詢(使用SQL查詢),而不是通過DB功能,但得到了相同的結果。
我的直覺是我的映射出了問題,或者NHibernate出了什麼問題:)
幫助!

回答

0

好吧,我發佈這個問題後不久,我就明白了。
寫這樣的東西真的幫助我,我猜。這是問題:
我使用的Id列不是唯一的。它是一個ID,只是不是查詢的正確ID。這是爲什麼?因爲我的查詢返回來自三個不同表的三個查詢的聯合,並且返回的ID實際上是ItemId(與傳遞給該函數的ID相同)

所以現在我必須擁有唯一的ID。我試圖簡單地使用NHibernate的composite-id標籤而不是id--但是面臨困難,我決定不浪費更多時間在automagical上並從查詢中返回ID。


找出我無法使用SELECT IDENTITY()INTO ...函數內的一個表變量,我認爲RAND爲秒,並最終使用ROW_NUMBER()OVER(排序等等)產生我的僞ID 。 現在這個作品很好,雖然這個代碼不會贏得選美比賽。
PS:得到了更好的方式來生成ID的建議?或者你有沒有得到複合id爲你工作?讓我知道...

+0

更好的方式來生成ID的將是在SQL Server中的NEWID()函數。它會生成一個可用於此場景的新GUID。 – 2010-04-27 01:09:15