nhibernate集团

nhibernate集团,nhibernate,Nhibernate,我希望能显示所有订购产品的清单。我可以使用下面的sql语句来显示它 select products.Id,count(products.Id), products.Name from Products inner join orderitems on Products.Id = orderItems.ProductId left join orders on orderItems.OrderId = orders.Id where orders.CompanyId = 27 group by p

我希望能显示所有订购产品的清单。我可以使用下面的sql语句来显示它

select products.Id,count(products.Id), products.Name from Products
inner join orderitems on Products.Id = orderItems.ProductId
left join orders on orderItems.OrderId = orders.Id
where orders.CompanyId = 27
group by products.Id,products.Name
我有以下实体 具有外键关系的订单、订单项、产品

我创建了以下投影类

public class OrderProduct
{
    public int Id { get; set; } // removed virtual
    public string Name { get; set; } // removed virtual
    public int Quantity { get; set; } // removed virtual
}
不管怎样,我希望有人能教我如何使用api或hql来处理这个查询

使现代化 下面是rafaels示例,我将hql简化为

 var hql = @"select p.Id, p.Name, count(p.Id) as Quantity 
            from OrderItem oi 
                inner join oi.Product p on p.Id = oi.Product.Id 
                group by p.Id, p.Name";
这将返回以下sql语句

select product1_.Id as col_0_0_, product1_.Name as col_1_0_, count(product1_.Id) as col_2_0_ from OrderItems orderitem0_ inner join Products product1_ on orderitem0_.ProductId=product1_.Id
这是非常接近,但它似乎忽略了该组,给了我以下错误

列“Products.Id”在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中

订单项 产品

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="EStore.Domain"
                   namespace="EStore.Domain.Model">

  <class name="Product" table="Products">
    <id name="Id" type="Int32" column="Id" unsaved-value="0">
      <generator class="identity"/>
    </id>

    <property name="MinQuantity" column="MinQuantity" type="Int32" not-null="true" />
    <property name="MaxQuantity" column="MaxQuantity" type="Int32" not-null="true" />
    <property name="Name" column="Name" />

  </class>
</hibernate-mapping>
试试这个:

var hql = @"select p.Id, p.Name, count(p.Id) as Quantity 
            from OrderItem oi 
               inner join oi.Products p where p.Id = oi.Product.Id 
               left  join oi.Order o where o.Id = oi.Order.Id 
                 with o.Company.Id = :companyId 
            group by p.Id, p.Name";


var result = session.CreateQuery(hql)
     .SetParameter("companyId", 27)
     .SetResultTransformer(Transformers.AliasToBean(typeof(OrderProduct)))
     .List<OrderProduct>();
注意:如果查询失败,请尝试,而不是使用o.Company


非常感谢,不知道你是否有任何想法,为什么小组没有通过。请参阅上面的更新。我尝试了该查询,但现在在类“EStore.Domain.Projection.OrderProduct”中找不到属性“0”的setter。我是否需要OrderProduct的hbm文件。有关我的OrderProduct类,请参见上文。如果我需要一个hbm文件,我会为数量设置什么property@frosty你的批量课程不需要HBM。现在,您能否尝试将结果类型更改为simply List,并查看对象列表是否正确返回?因此,我们可以将查询问题从转换问题中分离出来;2能否更新以显示映射和/或类?这是可疑的…1更改为列表,并按预期工作我得到一个列表,其中包含3个元素int,string,int2添加hbm以上。有趣的。。。我想我以前从来没有吃过这个。您是否可以在探查器/记录器中检查计数*的SQL是否已分配名称“Quantity”?我认为这是把变量重新命名为“疯狂”。
var hql = @"select p.Id, p.Name, count(p.Id) as Quantity 
            from OrderItem oi 
               inner join oi.Products p where p.Id = oi.Product.Id 
               left  join oi.Order o where o.Id = oi.Order.Id 
                 with o.Company.Id = :companyId 
            group by p.Id, p.Name";


var result = session.CreateQuery(hql)
     .SetParameter("companyId", 27)
     .SetResultTransformer(Transformers.AliasToBean(typeof(OrderProduct)))
     .List<OrderProduct>();