Conversão SQL para HQL [fechado]
Pergunta
Eu estou tentando converter o abaixo consulta SQL para HQL e estou tendo alguns problemas. Uma linha reta pela conversão linha não trabalho, eu estou querendo saber se eu deveria estar usando uma junção interna no 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 ;
Consulta retorna tempo em segundos entre as mudanças de estado para uma ordem do cliente.
Os nomes dos estados e datas são inseridos de forma dinâmica na consulta.
Edit: Apenas tentei este
"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";
e exceção recebido " exterior ou full join deve ser seguido por expressão de caminho "
Solução
Normalmente você HQL junta são especificados usando a propriedade sobre o objeto, por exemplo, se a classe Foo e Bar e Foo.bar é do tipo de bar, em seguida, from Foo f inner join f.bar as b
é a aderir. Tanto quanto eu sei, não há nenhuma maneira de realizar uma auto-associação em HQL (eu poderia estar errado aqui).
Dito isso, Hibernate permite que você escreva (ligeiramente aumentado) consultas SQL com session.createSQLQuery(...)
.
Outras dicas
acabou mudando de usar SQL nativo e um PreparedStatement como parece que session.createSQLQuery do Hibernate () só irá funcionar para entidades geridas.