我有以下的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
答案 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