2

好吧,基本上我正在尝试找出一种方法来获得 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>有关,但我不知道该怎么做。

任何帮助都深表感谢。

4

2 回答 2

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>;
于 2012-10-18T08:35:36.567 回答
1

您正在投影数据,因此您没有从数据库中获取 Product(或 SaleItem)。您需要使用非泛型 List() 来获取对象列表。这些对象将是对象数组,其元素对应于投影值。

要一次性获取整个产品,您必须将该查询粘贴到子查询中,其中外部查询返回由子查询标识的产品的完整产品数据。

于 2012-10-18T07:39:34.577 回答