hql join - 连接所需的路径

时间:2010-10-11 12:32:30

标签: nhibernate hql

我有以下的hql。如果我不尝试包含“OrderItem”实体,这可以正常工作。据我所知,hql中没有“on”子句。加入orderItem

的最佳方式是什么?
 var hql = new StringBuilder();
    hql.Append(
    @"select p.Id, p.Name, p.Description, p.ProductKey, p.CustomerSku, p.ImageUrl, p.ImageThumbUrl, p.ImageLargeUrl,COUNT(oi.Quantity) as quantity 
            from ProductCampaign pc
            join pc.Product p 
            left join OrderItem oi with oi.Product.Id = p.Id
            where pc.Campaign.Id = :CampaignId ");

   hql.Append(@"group by p.Id, p.Name, P.Description, p.ProductKey, p.CustomerSku, p.ImageUrl, p.ImageThumbUrl, p.ImageLargeUrl ");
   var results = _session.CreateQuery(hql.ToString());
   results.SetParameter("CampaignId", campaignId);

这是我希望实现的sql。

select p.Id, p.name, p.description, p.ProductKey, p.CustomerSku, p.ImageUrl, p.ImageThumbUrl, p.ImageLargeUrl,COUNT(oi.Quantity) as quantity from ProductCampaign pc
inner join Products p on pc.ProductId = p.Id
left join orderitems oi on pc.ProductId = oi.ProductId
where pc.CampaignId = 1
group by  p.Id, p.name, p.description, p.ProductKey, p.CustomerSku, p.ImageUrl, p.ImageThumbUrl, p.ImageLargeUrl

2 个答案:

答案 0 :(得分:2)

为了使用HQL左连接,必须映射关系,因为预期来自其中一个“from”表的路径(请参阅13.3. Associations and joins

尝试将OrderItems.Product ID更改为正确的产品many-to-one,然后使用right join

作为旁注,您的实体名称应该是单数。看起来您只是将表结构复制为类。

答案 1 :(得分:0)

尝试使用where代替with

select p.Id, p.Name, p.Description, p.ProductKey, p.CustomerSku, p.ImageUrl, p.ImageThumbUrl, p.ImageLargeUrl, COUNT(oi.Quantity) as quantity 
            from ProductCampaign pc
            join pc.Product p             
            left join OrderItem oi where oi.Product.Id = p.Id 
            and pc.Campaign.Id = :CampaignId

NHibernate Non-Mapped Joins