开发者

nhibernate group by

开发者 https://www.devze.com 2023-01-18 06:15 出处:网络
I\'m hoping to display a list of all of the p开发者_JAVA技巧roducts ordered. I can display this using the following sql statement

I'm hoping to display a list of all of the p开发者_JAVA技巧roducts ordered. I can display this using the following sql statement

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

I have the following entities Order, OrderItem, Product which have foreign key relationships.

I have created the following projection class

public class OrderProduct
{
    public int Id { get; set; } // removed virtual
    public string Name { get; set; } // removed virtual
    public int Quantity { get; set; } // removed virtual
}

Anyway, just hoping someone could kick start how i should approach this query with criteria api or hql

update

following rafaels example i have simplified the hql to

 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";

this returns the following 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

which is very close, however it seems to ignore the group by giving me the following error

Column 'Products.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

orderItem

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

  <class name="OrderItem" table="OrderItems">
    <id name="Id" type="Int32" column="Id" unsaved-value="0">
      <generator class="identity"/>
    </id>
    <property name="Name" column="Name"/>
    <set name="OrderItemAddresses" table="OrderItemAddress" generic="true" cascade="all-delete-orphan"  inverse="true" >
      <key column="OrderItemId" not-null="true" />
      <one-to-many class="EStore.Domain.Model.OrderItemAddress, EStore.Domain" />
    </set>
    <many-to-one name="Product" column="ProductId"  not-null="true" class="EStore.Domain.Model.Product, EStore.Domain" />
    <many-to-one name="Order" column="OrderId"  not-null="true" class="EStore.Domain.Model.Order, EStore.Domain" />
  </class>
</hibernate-mapping>

## product ##

<?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>


Try this:

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>();

Note: If the query fails, do try and instead of with o.Company...


  • HQL: The Hibernate Query Language
  • Ad-hock mapping
0

精彩评论

暂无评论...
验证码 换一张
取 消