2011-02-13 82 views
6

這個HQL語句,當執行這將產生以下結果:如何將此HQL轉換爲DetachedCriteria?

select t, count(s) from Submission s right join s.Topics as t GROUP BY t.Id 

result[0] 
    [0] topic_id, topic_name, ... 
    [1] 10 

result[1] 
    [0] topic_id, topic_name, ... 
    [1] 12 
    . 
result[n] 
    [0] topic_id, topic_name, ... 
    [1] 19 

將這個DetachedCriteria API產生幾乎相同的結果,但沒有加載主題

ProjectionList PrjList = Projections.ProjectionList(); 
PrjList.Add(Projections.GroupProperty("Topics"), "t"); 
PrjList.Add(Projections.Count("Id")); 

DetachedCriteria Filter = DetachedCriteria.For<Submission>(); 
Filter.CreateCriteria("Topics", "t", JoinType.RightOuterJoin); 
Filter.SetProjection(PrjList); 

result[0] 
    [0] null 
    [1] 10 

result[1] 
    [0] null 
    [1] 12 
    . 
result[n] 
    [0] null 
    [1] 19 

出於某種原因,NHibernate的拒絕創建主題對象爲結果集,但它爲HQL查詢。這是爲什麼?

+0

您試圖GroupProperty類,但不是屬性。我擔心你應該把你在主題中的每個屬性分組到ProjectionList中。在這種情況下,我會做一個方法擴展,將調用類的每個屬性添加到分組。 – Genius 2011-02-13 13:25:25

+0

NHibernate,使用HQL查詢,能夠做我在這裏嘗試的。我只是想找出使用​​Criteria API做同樣事情的方法。然而,你提出的建議將需要我希望避免的轉變。 – Roman 2011-02-13 13:40:52

回答

0
var orderIDsContainingCurrentSku = DetachedCriteria.For<OrderItem>() 
    .Add<OrderItem>(x=>x.Product.SKU==sku) 
    .SetProjection(Projections.Property("Order.id")); 
var skusOfProductsAppearingInOrdersContainingCurrentSku = DetachedCriteria.For<OrderItem>() 
    .SetProjection(Projections.GroupProperty("Product.id")) 
    .AddOrder(NHibernate.Criterion.Order.Desc(Projections.Count("Order.id"))) 
    .Add<OrderItem>(x=>x.Product.SKU!=sku) 
    .Add(Subqueries.PropertyIn("Order.id", orderIDsContainingCurrentSku)) 
    .SetMaxResults(15); 
var recommended = _session.CreateCriteria<Product>() 
    .SetFetchMode<Product>(x => x.Descriptors, FetchMode.Join) 
    .Add(Subqueries.PropertyIn("id", skusOfProductsAppearingInOrdersContainingCurrentSku)) 
    .SetResultTransformer(Transformers.DistinctRootEntity) 
    .List<Product>(); 

這裏是產生的SQL:

SELECT this_.SKU     as SKU1_1_, 
    this_.ProductName   as ProductN2_1_1_, 
    this_.BasePrice   as BasePrice1_1_, 
    this_.WeightInPounds  as WeightIn4_1_1_, 
    this_.DateAvailable  as DateAvai5_1_1_, 
    this_.EstimatedDelivery as Estimate6_1_1_, 
    this_.AllowBackOrder  as AllowBac7_1_1_, 
    this_.IsTaxable   as IsTaxable1_1_, 
    this_.DefaultImageFile as DefaultI9_1_1_, 
    this_.AmountOnHand  as AmountO10_1_1_, 
    this_.AllowPreOrder  as AllowPr11_1_1_, 
    this_.DeliveryMethodID as Deliver12_1_1_, 
    this_.InventoryStatusID as Invento13_1_1_, 
    descriptor2_.SKU   as SKU3_, 
    descriptor2_.DescriptorID as Descript1_3_, 
    descriptor2_.DescriptorID as Descript1_4_0_, 
    descriptor2_.Title  as Title4_0_, 
    descriptor2_.Body   as Body4_0_ 
FROM Products this_ 
    left outer join ProductDescriptors descriptor2_ 
    on this_.SKU = descriptor2_.SKU 
WHERE this_.SKU in (SELECT top 15 this_0_.SKU as y0_ 
FROM  OrderItems this_0_ 
WHERE not (this_0_.SKU = 'Binoculars2' /* @p0 */) 
    and this_0_.OrderID in (SELECT this_0_0_.OrderID as y0_ 
     FROM OrderItems this_0_0_ 
     WHERE this_0_0_.SKU = 'Binoculars2' /* @p1 */) 
      GROUP BY this_0_.SKU 
      ORDER BY count(this_0_.OrderID) desc) 

查看它是如何做http://ayende.com/blog/4315/building-a-recommendation-engine-in-nhibernate