2011-02-13 73 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