質問
以下の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";
および受信した例外&quot; 外部結合または完全結合の後にパス式が続く必要があります&quot;
解決
通常、HQL結合はオブジェクトのプロパティを使用して指定されます。たとえば、クラスFooおよびBarおよびFoo.barがBar型の場合、 from Foo f inner join f.bar as b
結合です。私の知る限り、HQLで自己結合を実行する方法はありません(ここで間違っている可能性があります)。
とはいえ、Hibernateを使用すると、 session.createSQLQuery(...)
を使用して(わずかに強化された)SQLクエリを作成できます。
他のヒント
Hibernateのsession.createSQLQuery()はマネージエンティティに対してのみ機能するように見えるため、ネイティブSQLとPreparedStatementを使用するように変更されました。
所属していません StackOverflow