好吧,基本上我正试图找到一种方法来获得10个最畅销的产品。我可以通过以下SQL查询轻松实现的东西:
SELECT `product`.*
FROM `product`
INNER JOIN `sale_item` ON `product`.`id` = `sale_item`.`product_id`
GROUP BY `product`.`id`
ORDER BY SUM(`sale_item`.`quantity`) DESC
LIMIT 10;
我最接近NHibernate的成功,我相信是这样的:
ICriteria criteria = NHibernateSession
.CreateCriteria<SaleItem>("SaleItem")
.SetMaxResults(10)
.CreateCriteria("ID.Product")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("ID.Product"))
.Add(Projections.Sum("SaleItem.Quantity"), "QuantitySum")
)
.AddOrder(Order.Desc("QuantitySum"));
List<Product> l = criteria
.List<Product>() as List<Product>;
生成了以下SQL(与我的非常相似):
SELECT this_.product_id AS y0_,
sum(this_.quantity) AS y1_
FROM sale_item this_
INNER JOIN product product1_ ON this_.product_id=product1_.id
GROUP BY this_.product_id
ORDER BY y1_ DESC LIMIT 10;
不幸的是,它在执行查询时失败了。我很确定这与我做.CreateCriteria<SaleItem>
然后问.List<Product>
有关,但我不知道如何做到这一点。
非常感谢任何帮助。
答案 0 :(得分:3)
您可以使用Transformers.AliasToBean<Product>()
结果转换器:
ICriteria criteria = NHibernateSession
.CreateCriteria<SaleItem>("SaleItem")
.SetMaxResults(10)
.CreateCriteria("ID.Product")
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("ID.Product"), "ID")
.Add(..., "...") // another Product property
.Add(Projections.Sum("SaleItem.Quantity"), "QuantitySum")
)
.AddOrder(Order.Desc("QuantitySum"));
List<Product> l = criteria
.SetResultTransformer(Transformers.AliasToBean<Product>());
.List<Product>() as List<Product>;
答案 1 :(得分:1)
您正在投影数据,因此您没有从数据库中获取Product(也不是SaleItem)。您需要使用非泛型List()来获取对象列表。这些对象将是对象数组,其元素对应于投影值。
要一次性获取整个产品,您必须将该查询放在子查询中,其中外部查询返回子查询标识的产品的完整产品数据。