NHibernate ICriteria返回空结果

时间:2015-06-01 05:56:42

标签: c# hibernate nhibernate fluent-nhibernate

我正在使用NHibernate并创建如下查询: -

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:

public class PayinoutBookentry 
{
    public virtual int PayinoutBookentryId { get; set; }

    public virtual Methodofpayment PaymentOption { get; set; }
}

映射器:

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);
        });

但是当我尝试获取列表时,我只在列表中获得一行,并且该行具有空对象。

有人可以告诉我GroupProperty出了什么问题吗?如果没有GroupProperty它工作正常。

1 个答案:

答案 0 :(得分:4)

我们收到的结果非常正确 - 与查询有关。因为上面的ICriteria 查询最终会出现在此SQL语句中:

SELECT this_.PAYMENT_OPTION as y0_ 
FROM [test].[payinout_bookentry] this_ 
GROUP BY     this_.PAYMENT_OPTION

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

...
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

// iterates retrieved data and convert them into properties
criteria.SetResultTransformer(Transformers.AliasToBean<PayinoutBookentry>());

我们到处都有(和默认的ValueTypes)几乎为NULL - 因为它是如何工作的。

那么,我们可以做些什么来改变它?

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

...
projList.Add(Projections.Count("PayinoutBookentryId").As("PayinoutBookentryId"));
...

但实际上,这没有任何意义,因为在ID栏中,我们知道所有ID都会(已转换)...这不是我们想要的。

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

但是如果我们想让BookEntries与某些付款有关......我会简单地使用WHERE,例如:

criteria.Add(Restrictions
              .Where<PayinoutBookentry>(o => o.PaymentOption.ID == somePaymentOptionType));

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

了解更多信息: