3

以下の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";

例外を受け取りました"外部結合または完全結合の後にパス式を続ける必要があります"

4

2 に答える 2

6

通常、HQL 結合は、オブジェクトのプロパティを使用して指定されます。たとえば、クラス Foo と Bar および Foo.bar が Bar 型の場合from Foo f inner join f.bar as bは結合です。私の知る限り、HQL で自己結合を実行する方法はありません (ここで間違っている可能性があります)。

とはいえ、Hibernate を使用すると、(わずかに拡張された) SQL クエリを で記述できますsession.createSQLQuery(...)

于 2008-11-05T23:40:27.173 に答える
0

Hibernate の session.createSQLQuery() は管理対象エンティティに対してのみ機能するように思われるため、ネイティブ SQL と PreparedStatement を使用するように変更しました。

于 2008-11-06T02:43:52.590 に答える