首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NHibernate ICriteria返回空结果

NHibernate ICriteria返回空结果
EN

Stack Overflow用户
提问于 2015-06-01 13:56:42
回答 1查看 619关注 0票数 1

我使用NHibernate并创建查询,如下所示:

代码语言:javascript
复制
ICriteria criteria = session.CreateCriteria<PayinoutBookentry>();
ProjectionList projList = Projections.ProjectionList();
             projList.Add(Projections.GroupProperty("PaymentOption").As("PaymentOption"));
             criteria.SetProjection(projList);
             criteria.SetResultTransformer(Transformers.AliasToBean<PayinoutBookentry>());

IList<PayinoutBookentry> payinoutBookentryList = criteria.List<PayinoutBookentry>();

POCO:

代码语言:javascript
复制
public class PayinoutBookentry 
{
    public virtual int PayinoutBookentryId { get; set; }

    public virtual Methodofpayment PaymentOption { get; set; }
}

映射器:

代码语言:javascript
复制
public PayinoutBookentryMap() 
{
        Table("payinout_bookentry");
        Schema("test");
        Lazy(true);
        Id(x => x.PayinoutBookentryId, map => { 
           map.Column("PAYINOUT_BOOKENTRY_ID");
           map.Generator(Generators.Native); });

        ManyToOne(x => x.PaymentOption, map =>
        {
            map.Column("PAYMENT_OPTION");
            //  map.NotNullable(true);
            map.Cascade(Cascade.None);
        });

但是当我尝试获取list时,我在list中只得到了一行,而且该行有空对象。

有没有人能让我知道GroupProperty怎么了?就像没有GroupProperty一样,它工作得很好。

EN

回答 1

Stack Overflow用户

发布于 2015-06-01 14:53:15

我们收到的结果确实是正确的--就查询而言。因为上面的ICriteria查询将以下面的SQL语句结束:

代码语言:javascript
复制
SELECT this_.PAYMENT_OPTION as y0_ 
FROM [test].[payinout_bookentry] this_ 
GROUP BY     this_.PAYMENT_OPTION

正如我们所看到的,只有GROUP BY列在SELECT子句中...未选择其他任何内容。

代码语言:javascript
复制
...
ProjectionList projList = Projections.ProjectionList();
// just one projected SELECT statement
projList.Add(Projections.GroupProperty("PaymentOption").As("PaymentOption"));
// still only one SELECT result
criteria.SetProjection(projList);

因此,即使我们在下一行中使用Transformer

代码语言:javascript
复制
// iterates retrieved data and convert them into properties
criteria.SetResultTransformer(Transformers.AliasToBean<PayinoutBookentry>());

我们仍然到处都是NULL (和默认的ValueTypes) --因为这就是它的工作方式。

那么,我们可以做些什么来改变这一点呢?

首先,我们可以在投影中添加更多的列

代码语言:javascript
复制
...
projList.Add(Projections.Count("PayinoutBookentryId").As("PayinoutBookentryId"));
...

但实际上,这是没有意义的,因为在ID列中,我们知道会有(转换)所有ID的计数……这不是我们想要的。

这一切都在发生,因为(我猜)这里使用的投影和分组方式不正确。它用于某种类型的报告(我们创建DTO并计算每种类型有多少钱,计数)

但如果我们想要获得与某些付款相关的BookEntries ..我会简单地使用WHERE,例如:

代码语言:javascript
复制
criteria.Add(Restrictions
              .Where<PayinoutBookentry>(o => o.PaymentOption.ID == somePaymentOptionType));

这样我们就可以得到与过滤支付类型相关的所有条目...

阅读更多关于它的信息:

  • 15.2. Narrowing the result set
  • 15.7. Projections, aggregation and grouping
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30566503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档