c# - NHibernate 的 ISQLQuery 返回非预期类型的​​实例

标签 c# nhibernate

我使用的是 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/

相关文章:

c# - SQL Server 数据库有大小限制吗?

NHibernate 一对一映射,非主键

nhibernate - 使用 QueryOver 的相关实体中的 Fluent NHibernate 按属性排序

nhibernate - 为什么 NHibernate 需要不可设置的成员是虚拟的?

nhibernate - 当我删除父引用时,如何让 NHibernate 删除子引用?

c# - Omu.ValueInjecter 在允许设置发生之前检查属性

c# - 使用特定接口(interface)时的 MEF 组合导入问题

c# - 必须使用 Select 语句声明标量变量错误 C# ASP.NET Sql 命令

C# UTF8 输出保持编码字符完整

NHibernate 复合元素通过代码映射