这个HQL语句在执行时会产生以下结果:
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 :(得分:3)
在http://ayende.com/blog/tags/nhibernate?page=3上查看Ayende博客上的独立标准。它为您提供了关于左外连接和HQL分组的非常详细的分步指南以及背后的映射。
答案 1 :(得分: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如何完成!