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
,它工作得很好。
我们正在接收的结果,是真正正确的-相对于查询。因为上面的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。预测、聚合和分组