two tables query not left ejemplo delete hibernate hql

hibernate - tables - Conversión de SQL a HQL



hql left join (2)

Estoy tratando de convertir la consulta SQL a continuación a HQL y estoy teniendo algunos problemas. Una conversión de línea recta por línea no funciona, me pregunto si debería usar una unión interna en 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 ;

La consulta devuelve el tiempo en segundos entre cambios de estado para un pedido de cliente.

Los nombres de estado y las fechas se insertan dinámicamente en la consulta.

Editar: Acabo de probar esto

"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";

y recibió la excepción " unión externa o completa debe ser seguida por la expresión de ruta "


Normalmente, las uniones de HQL se especifican utilizando la propiedad del objeto, por ejemplo, si la clase Foo y Bar y Foo.bar son de tipo Bar, luego from Foo f inner join f.bar as b es la unión. Por lo que yo sé, no hay forma de realizar una auto-unión en HQL (podría estar equivocado aquí).

Dicho esto, Hibernate le permite escribir consultas SQL (levemente mejoradas) con session.createSQLQuery(...) .


Terminó cambiando para usar SQL nativo y PreparedStatement, ya que parece que session.createSQLQuery () de Hibernate solo funcionará para Entidades Administradas.