문제

아래 SQL 쿼리를 HQL로 변환하려고 노력하고 있으며 몇 가지 문제가 있습니다. 라인별로 전환이 작동하지 않습니다. 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";

그리고 예외를 받았다 "외부 또는 전체 조인 뒤에 경로 표현이 있어야합니다."

도움이 되었습니까?

해결책

일반적으로 HQL 결합 from Foo f inner join f.bar as b 가입입니다. 내가 아는 한, HQL에서 자체 합의를 수행하는 방법은 없습니다 (여기서는 잘못 될 수 있습니다).

즉, Hibernate는 다음과 같이 (약간 향상된) SQL 쿼리를 작성할 수 있습니다. session.createSQLQuery(...).

다른 팁

Hibernate의 Session.createsQlQuery ()가 관리 된 엔티티에서만 작동하는 것처럼 보이기 때문에 기본 SQL과 준비된 지정을 사용하도록 변경되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top