2013-05-24 2 views
0

Использование Northwind database Я хотел бы сделать запросы какHQL - необычные запросы

  • Количества заказов от каждого Customer.Country
  • Что является суммой OrderDetails.UnitPrice на каждый день недели
  • Средних время от Order.RequiredDate до Order.ShippedDate каждый год
  • ... больше запросов, как эти

я должен используйте спящий режим для получения результата, но у меня есть сильное чувство, что это бессмысленно. Теперь я использую 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

что-то, чтобы быть в курсе, что SQLQuery делает зависимой базу данных приложения, HQL является более разумным, чем при использовании SQLqueries ... И критерия предлагает вам более читаемые решения для Dinamic запросов, то не будет боясь использовать эти инструменты, когда это необходимо. Ваш вопрос звучит для меня немного общего, так как вы не предоставляете никакой отправной точки из своих знаний, большинство сторонников будут направлять вас к учебникам. – Ziul

+0

@ Ziul Я отредактировал свой вопрос. Я хорошо знаю SQL, но я новичок в HQL, и я пробовал только базовые примеры. – alicjasalamon

ответ

2

Как эти «необычные» запросы? Это именно те запросы, которые показывают, почему RDBMS все еще существует. К сожалению, вы не показываете свои сопоставления, поэтому я сделаю несколько предположений ... Посмотрите на некоторые из ваших пуль:

Во-первых, количество заказов от каждого клиента. Страна. Я предполагаю, что вы сопоставили ПОРЯДКА> Клиент как @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.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.Для получения дополнительной информации см 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

+0

«unusal» Я имею в виду, что я никогда не видел таких запросов в учебниках HQL для новичков (но они распространены в учебниках по SQL), поскольку цель состоит не в том, чтобы получить набор объектов (например, Shippers или Customers). Спасибо! – alicjasalamon