使用Northwind database我想提出像
这样的查询我必须使用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
这些“不寻常”查询的方法吗?
答案 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.html或http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#portability-functions