2013-05-24 5 views
0

Northwind database를 사용하여 내가 주 HQL - 특별한 쿼리

  • 평균의 매일을위한 OrderDetails.UnitPrice의 합이 무엇 각 Customer.Country
  • 에서 주문

    • 번호와 같은 질의를하고 싶습니다 매년
    • Order.ShippedDate하는 Order.RequiredDate에서 시간 ... 난에있는이

    같은 더 쿼리 최대 절전 모드를 사용하여 결과를 얻지 만, 나는 그것이 무의미하다는 강한 느낌을 가지고있다. 이제 SQL을 사용하여 결과를 쉽게 얻을 수 있기 때문에 createSQLQuery()을 사용합니다.

    그러나 이것을 수행하는 방법은 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

    뭔가 알고 있어야 볼 수 해달라고 필요한 경우 해당 도구를 사용하는 것을 두려워합니다. 귀하의 지식에서 시작점을 제공하지 않으므로 귀하의 질문은 나에게 일반적으로 들리지만 대부분의 승자는 귀하를 지침서로 안내합니다. – Ziul

    +0

    @ Ziul 제 질문을 수정했습니다. 나는 SQL을 아주 잘 알고 있지만 HQL을 처음 접했고 기본적인 예제 만 시도했다. – alicjasalamon

    답변

    2

    "비정상적인"검색어는 어떻게 표시됩니까? 이것들은 RDBMS가 아직도 왜 있는지를 보여주는 쿼리의 종류입니다. 불행하게도 당신은 그래서 당신의 총알의 일부를 보면 ... 몇 가지 가정을 만들 것입니다, 당신의 매핑을 표시하지 않습니다 :

    는 첫째, 각 Customer.Country에서 주문 번호를. 난 당신이 명령 ->를 @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!) 가정에 대한 : OrderDetails.UnitPrice의 합은 무엇

    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-> 주문이 매핑 된 것을 있다고 가정 할 것이다 "주의 날"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(); 
    ... 
    

    한 가지 기능의 사용이다. 이 데이터베이스 기능에 직접 변환 할 수 있지만 최대 절전 모드 사투리와 매핑 기능 템플릿을 통해 매핑됩니다.추가 정보를 들어, HQL은 SQLqueries ... 그리고 기준을 사용하는 dinamic 쿼리에 대한 당신의 가독성 솔루션을 제공보다 더 합리적이다,은 SQLQuery 응용 프로그램 데이터베이스에 의존하게한다는 것입니다, 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 튜토리얼에서 이러한 쿼리를 본 적이 없다는 것을 의미합니다.하지만 목표는 Shippers 또는 Customers와 같은 객체 집합을 얻지 않기 때문에 SQL 튜토리얼에서는 공통적입니다. 고맙습니다! – alicjasalamon