我正在使用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
它工作正常。
答案 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));
这样我们就可以获得与过滤付款类型相关的所有条目......
了解更多信息: