0

使用Northwind 数据库我想进行如下查询

  • 每个 Customer.Country 的订单数
  • 一周中每一天的 OrderDetails.UnitPrice 的总和是多少
  • 每年从 Order.RequiredDate 到 Order.ShippedDate 的平均时间
  • ...更多类似这样的查询

我必须使用hibernate才能获得结果,但我强烈认为它毫无意义。现在我使用createSQLQuery(),因为我可以使用 SQL 轻松获得结果。

但是如何使用HQL呢?你能给我举个例子吗?我认为使用HQL并不是最合理的,但我想知道如何做到这一点。

[编辑]

例如可以查询:

select avg(DATEDIFF(ShippedDate, OrderDate)), year(ShippedDate) from orders group by year(ShippedDate)

被翻译成HQL?还是我应该先获得所有订单并在我的申请中自己计算结果?

或者

select CompanyName, year(ShippedDate), sum(UnitPrice)/sum(Quantity) from shippers inner join orders on ShipperID = ShipVia inner join orderdetails on orderdetails.OrderID = orders.OrderID group by CompanyName, year(ShippedDate)

如果我不要求像 Order 或 Shipper 这样的对象集,我可以使用HQL吗?

我看过很多教程,但它们都提到了“面向目标”的查询。你能告诉我如何翻译HQL这些“不寻常”的查询吗?

4

1 回答 1

2

这些“不寻常”的查询如何?这些正是显示为什么 RDBMS 仍然存在的查询类型。不幸的是你没有显示你的映射,所以我会做一些假设......看看你的一些子弹:

首先,来自每个 Customer.Country 的订单数。我假设您已将 Order->Customer 映射为@ManyToOne关联

List results = session.createQuery( "select c.country, count(o.id) from Order o join o.customer c" ).list();
Object[] result = (Object[]) results.get( 0 );
print( "Country : " + result[0] );
print( "Number of Orders : " + result[1] );

或者假设结果的包装器(OO!)如何:

List results = session.createQuery( "select new CountryOrderCount( c.country, count(o.id) ) from Order o join o.customer c" ).list();
CountryOrderCount result = (CountryOrderCount) results.get( 0 );
print( "Country : " + result.getCountry() );
print( "Number of Orders : " + result.getOrderCount() );

一周中每一天的 OrderDetails.UnitPrice 的总和是多少。我假设您已映射 OrderDetails->Order,并且“星期几”指的是 Order.OrderDate:

List results = session.createQuery( "select dayOfWeek(o.orderDate), sum(od.unitPrice) from OrderDetails od join od.order o group by dayOfWeek(o.orderDate)" ).list();
...

关于上面要注意的一点是函数的使用。这可能直接转换为数据库函数,但通过映射到 Hibernate Dialect 的函数模板进行映射。有关其他信息,请参阅http://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/dialect/function/package-summary.htmlhttp://docs.jboss.org/hibernate/orm /4.3/manual/en-US/html_single/#portability-functions

于 2013-05-24T17:45:54.840 回答