2008-11-05 6 views
3

아래의 SQL 쿼리를 HQL로 변환하려고하는데 몇 가지 문제가 있습니다. 직선 변환에 의해 작동하지 않는다면, HQL에서 내부 조인을 사용해야하는지 궁금합니다.SQL을 HQL로 변환

 SELECT (UNIX_TIMESTAMP(cosc1.change_date) - UNIX_TIMESTAMP(cosc2.change_date)) 
     FROM customer_order_state_change cosc1 
     LEFT JOIN customer_order_state cos1_new on cosc1.new_state_id = cos1_new.customer_order_state_id 
     LEFT JOIN customer_order_state cos1_old on cosc1.old_state_id = cos1_old.customer_order_state_id 
     LEFT JOIN customer_order_state_change cosc2 on cosc2.customer_order_id = cosc1.customer_order_id 
     LEFT JOIN customer_order_state cos2_new on cosc2.new_state_id = cos2_new.customer_order_state_id 
     LEFT JOIN customer_order_state cos2_old on cosc2.old_state_id = cos2_old.customer_order_state_id 
     WHERE cos1_new.name = "state1" AND cos2_new.name = "state2" and cosc2.change_date < "2008-11-06 09:00" 
AND cosc2.change_date > "2008-11-06 06:00" GROUP BY cosc1.change_date, cosc2.change_date ; 

쿼리는 고객 주문에 대한 상태 변경 간의 시간을 초 단위로 반환합니다.

상태 이름과 날짜는 동적으로 쿼리에 삽입됩니다.

편집 : 그냥이

"SELECT (UNIX_TIMESTAMP(cosc1.changeDate) - UNIX_TIMESTAMP(cosc2.changeDate))" + 
     " FROM" + 
     " " + CustomerOrderStateChange.class.getName() + " as cosc1" + 
     " INNER JOIN " + CustomerOrderStateChange.class.getName() + " as cosc2" + 
     " WHERE cosc1.newState.name = ?" + 
     " AND cosc1.order.id = cosc2.order.id" + 
     " AND cosc2.newState.name = ?" + 
     " AND cosc2.changeDate < ?" + 
     " AND cosc2.changeDate > ?" + 
     " GROUP BY cosc1.changeDate, cosc2.changeDate"; 

수신 예외 시도 일반적으로 "외부 또는 가입 전체가 경로 식 와야을"

답변

6

당신 HQL은 개체의 속성을 사용하여 지정 조인 예를 들어 Foo 클래스와 Bar 및 Foo.bar 유형이 Bar 인 경우 from Foo f inner join f.bar as b이 조인입니다. 내가 아는 한, HQL에서 자체 조인을 수행 할 방법이 없다 (나는 틀릴 수도있다).

즉, Hibernate는 session.createSQLQuery(...)으로 SQL 쿼리를 작성할 수있다.

+0

SQL 쿼리에 대한 "약간 향상된"구문 지원에 링크 또는 무언가를 제공 할 수 있습니까? –

0

하이버 네이트의 session.createSQLQuery()가 Managed Entities에서만 작동하는 것으로 보아 네이티브 SQL과 PreparedStatement를 사용하도록 끝났다.

관련 문제