NHibernate返回空结果

本文关键字:结果 返回 NHibernate | 更新日期: 2023-09-27 17:51:15

我使用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>();

少:

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

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

谁能告诉我GroupProperty有什么问题?没有GroupProperty,它工作得很好。

NHibernate返回空结果

我们正在接收的结果,是真正正确的-相对于查询。因为上面的ICriteria 查询将在以下SQL语句中结束:

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

可以看出,SELECT子句中只有GROUP BY列…没有其他选择。

...
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>());

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

那么,我们能做些什么来改变它呢?

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

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

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

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

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

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

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

详细阅读:

  • 15.2。缩小结果集
  • 15.7。预测、聚合和分组