gpt4 book ai didi

c# - NHibernate ICriteria 返回空结果

转载 作者:太空宇宙 更新时间:2023-11-03 21:21:14 26 4
gpt4 key购买 nike

我正在使用 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 一样,它工作正常。

最佳答案

我们收到的结果确实是正确的 - 与查询相关。因为上面的 ICriteria query 将在这个 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 (和默认值类型) - 因为它就是这样工作的。

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

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

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

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

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

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

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

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

了解更多信息:

关于c# - NHibernate ICriteria 返回空结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30566503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com