我正在使用NHibernate 2.1.2.400,但是ISQLQuery查询有问题。

我在这里使用ISQLQuery的原因是,该查询使用的表没有在NHibernate中映射任何实体。

查询如下所示:

ISQLQuery query = session.CreateSQLQuery (
    "select p.*, price.* " +
    "from prestation p left outer join prestationprice price on p.PrestationId = price.PrestationId " +
    "where p.Id IN ( select id from prestationregistry where ...");


“ Prestationregistry”是NHibernate未知的表(未映射,因此是本机SQL查询)。

我的代码继续像这样:

query.AddEntity ("p", typeof(Prestation));
query.AddJoin ("price", typeof(PrestationPrice));

query.SetResultTransformer (Transformers.DistinctRootEntity);

var result = query.List();


到目前为止,一切都很好。
我希望由于该查询而得到了“ Prestation”实例的列表,因为我已声明“ Prestation”为必须由AddEntity方法返回的根对象。
我还希望此查询能尽快加载每个Prestation的PrestationPrices(因此使用AddJoin方法)。

令我惊讶的是,List()方法返回PrestationPrice实例的集合,而不是Prestation实例的集合。
怎么来的 ?难道我做错了什么 ?如果是这样,您能告诉我我做错了什么吗?

编辑:附加信息:

当我调试并监视“查询”实例时,我可以看到查询的queryReturns成员包含2个项目:
-一个NativeSqlQueryRootReturn实例,其ReturnEntityName为'Prestation'
-一个NativeSqlQueryJoinReturn

当我未指定'DistinctRootEntity'结果转换器时,查询将返回'Prestation'实例而不是PrestationPrice。但是,它包含同一实例的多个副本。

最佳答案

我不确定这是否是造成您问题的真正原因,但是您必须将SQL别名括在大括号中,例如

select {p.*}, {price.*}
from prestation p
left outer join prestationprice price on p.PrestationId = price.PrestationId
where p.Id IN ( select id from prestationregistry where ...

10-02 17:22