我使用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);
});但是当我尝试获取list时,我在list中只得到了一行,而且该行有空对象。
有没有人能让我知道GroupProperty怎么了?就像没有GroupProperty一样,它工作得很好。
发布于 2015-06-01 14:53:15
我们收到的结果确实是正确的--就查询而言。因为上面的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>());我们仍然到处都是NULL (和默认的ValueTypes) --因为这就是它的工作方式。
那么,我们可以做些什么来改变这一点呢?
首先,我们可以在投影中添加更多的列
...
projList.Add(Projections.Count("PayinoutBookentryId").As("PayinoutBookentryId"));
...但实际上,这是没有意义的,因为在ID列中,我们知道会有(转换)所有ID的计数……这不是我们想要的。
这一切都在发生,因为(我猜)这里使用的投影和分组方式不正确。它用于某种类型的报告(我们创建DTO并计算每种类型有多少钱,计数)
但如果我们想要获得与某些付款相关的BookEntries ..我会简单地使用WHERE,例如:
criteria.Add(Restrictions
.Where<PayinoutBookentry>(o => o.PaymentOption.ID == somePaymentOptionType));这样我们就可以得到与过滤支付类型相关的所有条目...
阅读更多关于它的信息:
https://stackoverflow.com/questions/30566503
复制相似问题