我使用的是 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 未知的表(未映射,因此是 native 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 ...
关于c# - NHibernate 的 ISQLQuery 返回非预期类型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2600805/