HQL - 不寻常的查询

时间:2013-05-24 15:27:10

标签: hibernate hql northwind

使用Northwind database我想提出像

这样的查询
  • 每个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)

如果我不要求订单或托运人等对象,我可以使用HQL吗?

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

1 个答案:

答案 0 :(得分: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