Nhibernate 具有左联接提取的select的HQL

Nhibernate 具有左联接提取的select的HQL,nhibernate,hql,Nhibernate,Hql,[注意]请进一步查看我的更新,了解真正的问题。我保留了原来的一个,以防对任何人有用 我只是想让它工作起来。据我所知,它看起来像是文档中的Kats/Kittens示例,但是当我尝试使用它时,我得到了一个NullReferenceException CustomerOrder order = CurrentSession.CreateQuery( @"select new CustomerOrder(Name) from CustomerOrder o left jo

[注意]请进一步查看我的更新,了解真正的问题。我保留了原来的一个,以防对任何人有用

我只是想让它工作起来。据我所知,它看起来像是文档中的Kats/Kittens示例,但是当我尝试使用它时,我得到了一个NullReferenceException

CustomerOrder order = CurrentSession.CreateQuery(
    @"select new CustomerOrder(Name)
      from CustomerOrder o
      left join fetch o.OrderItems as items
      where o.Id = :Id")
    .SetParameter("Id", id)
    .UniqueResult<CustomerOrder>();
CustomerOrder订单=CurrentSession.CreateQuery(
@“选择新客户订单(名称)
来自客户订单o
左连接获取o.OrderItems作为项目
其中o.Id=:Id“)
.SetParameter(“Id”,Id)
.UniqueResult();
如果我省略了join fetch(只返回“CustomerOrder”,而不包含OrderItems),它就可以工作。我的CustomerOrder有一个构造函数,它接受一个字符串作为“Name”,数据库中有我正在检索的订单的OrderItems记录

我做错了什么

[更新] 我刚刚读到,我试图做的事情没有真正意义,因为我正在用一些值实例化一个新对象,我正在做的是有效地尝试获取OrderItems,就像它们属于新实例化的对象一样,而它们不属于新实例化的对象

我需要的是一个只填充名称字段的订单,以及它的集合或OrderItem子项,理想情况下只填充它们的“描述”字段。我希望这样做,所以我不会像HQL通常那样检索所有列(出于性能原因)

最好的方法是什么


感谢JB Nizet和Rippo的见解。我尝试了一些东西,性能很好(无论如何,就我的目的而言)。如果它真的会引起问题,我会查看ResultTransformer,但我确信我的应用程序的其他性能方面会对它的运行速度产生更大的影响(我可以通过分析等方式对其进行优化)比正在检索的列的数量多。

您是否测量过检索所有列对性能有重大影响?通常,行的数量很重要,但列的数量并不重要。此外,将部分填充的对象与实际实体的类型相同会造成混淆,破坏不变量,并且会导致错误。我只会把订单和他们的物品一起拿来,并且只有在真正需要的时候才进行优化。说实话。事实上,我也不是特别担心它,我总是把整个物体带回来,它从来没有给我带来问题。但是,我试图鼓励我的团队从ADO转移到NHibernate,在看到所有列都被检索到之后,这是他们主要关心的问题之一,所以我只是在尝试。您的评论非常有趣和有用,谢谢。我将运行一些比较,看看真正的区别是什么。如果它确实成为一个问题,并且是数据的只读副本,那么您可以使用
ResultTransformer
在DTO中进行投影,这样您只会得到您想要的。谢谢Rippo。我还没有机会运行任何测试,但我会记住这一点。希望明天有时间。