【问题标题】:NHibernate: SQL query results mappingNHibernate:SQL查询结果映射
【发布时间】:2012-08-05 07:43:57
【问题描述】:

我对 NHibernate 3.1.0.4000 中的 SQL 查询结果有疑问(我使用的是 MS SQL Server 2005 数据库)。我有两个表:AdvertsInvestments,它们映射到实体:AdvertInvestmentAdverts 通过InvestmentId 列(和外键)与Investments 连接。

为了保存我的查询结果,我创建了以下内部类:

    class InvestmentWithAdvertsCount
    {
        public Investment inv { get; set; }

        public int cnt { get; set; }
    }

查询如下:

var investementsWithAdvertCounts = _session.CreateSQLQuery(
                            "select {inv.*}, (select count(1) from Adverts where InvestmentId = inv.Id) cnt from Investments inv")
                            .AddScalar("cnt", NHibernateUtil.Int32)
                            .AddEntity("inv", typeof(Investment))
                            .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(InvestmentWithAdvertsCount)))
                            .List<InvestmentWithAdvertsCount>();

当我运行此查询时,我收到一组 InvestmentWithAdvertsCount 实例,这些实例具有正确填充的 cnt 属性,但 inv 属性设置为 null。我花了一些时间研究 NHibernate 源代码,似乎 inv 别名从查询中丢失了,NHibernate 甚至没有尝试填充 inv 属性。如果我删除.SetResultTransformer 部分,我会收到一个数组列表(object[2] 类型),其中第一个元素设置为Investment 实体,第二个元素设置为其相应的广告计数。您能否告诉我如何更改此查询以正确填写InvestmentWithAdvertsCount?或者也许有办法将此查询重写为 QueryOver、Criteria 或 HQL(保持生成的 SQL 代码高效)?

如果能在这个问题上提供任何帮助,我将非常感激。谢谢

【问题讨论】:

    标签: .net nhibernate


    【解决方案1】:

    这是一种简洁的方法,使用非常简单的 LINQ to 对象处理结果:

    session.CreateSQLQuery(
        "select {inv.*}, (select count(1) ... inv")
        .AddScalar("cnt", NHibernateUtil.Int32)
        .AddEntity("inv", typeof(Investment))
        .List<object[]>()
        .Select(x => new InvestmentWithAdvertsCount {inv = x[0], cnt = x[1]})
        .ToList();
    

    【讨论】:

    • 塔恩克斯迭戈。这实际上是我最终所做的:) 我只对是否有人可以解释为什么 Transformers.AliasToBean 不起作用感兴趣。但是,我会加分给您,如果没有提供其他答案,我会将您的答案标记为已接受。
    • IIRC,AliasToBean 使用标量属性,而不是实体别名。 IOW,它甚至没有看到您定义的“inv”,因为这会导致多个结果列,其中没有一个名为“inv”。
    • 酷,有道理。谢谢。
    猜你喜欢
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2014-06-25
    • 2018-08-16
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多