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 に答える