Frage

Ich versuche, die unterhalb SQL-Abfrage zu HQL konvertieren und ein paar Probleme habe. Eine gerade Linie durch die Linie Konvertierung nicht funktioniert, ich frage mich, ob ich in der HQL eine innere Verknüpfung sollte mit?

        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 ;

Abfrage gibt die Zeit in Sekunden zwischen Statusänderungen für einen Kundenauftrag.

Die Zustands Namen und Daten werden dynamisch in die Abfrage eingefügt.

Edit: Gerade versucht diese

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

und erhielt Ausnahme " Außen oder Voll beitreten muss Wegausdruck folgen "

War es hilfreich?

Lösung

Normalerweise verbindet man HQL werden mit der Eigenschaft auf dem Objekt angegeben wird, zB wenn Klasse Foo und Bar und Foo.bar vom Typ Bar ist, dann from Foo f inner join f.bar as b ist die Verbindung. Soweit ich weiß, gibt es keine Möglichkeit, eine Selbstverknüpfung in HQL (Ich könnte hier falsch sein).

die Durchführung

Das heißt, Hibernate können Sie (leicht verbessert) SQL-Abfragen mit session.createSQLQuery(...) schreiben.

Andere Tipps

Ändern Ended up nativen SQL zu verwenden und ein PreparedStatement wie es, dass die Hibernate scheint session.createSQLQuery () wird nur für verwaltete Einheiten arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top