2009-12-07 80 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