Преобразование SQL в HQL

Я пытаюсь преобразовать приведенный ниже 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";

и получено исключение "за внешним или полным объединением должно следовать выражение пути"


person Feet    schedule 05.11.2008    source источник


Ответы (2)


Обычно соединения HQL указываются с использованием свойства объекта, например, если класс Foo и Bar и Foo.bar имеют тип Bar, то from Foo f inner join f.bar as b является соединением. Насколько я знаю, в HQL нет способа выполнить самосоединение (здесь я могу ошибаться).

Тем не менее, Hibernate позволяет вам писать (слегка улучшенные) SQL-запросы с помощью session.createSQLQuery(...).

person Nick    schedule 05.11.2008
comment
Можете ли вы предоставить ссылку или что-то еще на слегка расширенную поддержку синтаксиса для запросов SQL? - person Jason Kleban; 11.03.2011

В итоге было изменено использование собственного SQL и PreparedStatement, поскольку кажется, что Hibernate session.createSQLQuery() будет работать только для управляемых объектов.

person Feet    schedule 06.11.2008