Domanda

Sto cercando di convertire la query SQL di seguito in HQL e sto riscontrando alcuni problemi. Una conversione riga per riga non funziona, mi chiedo se dovrei utilizzare un Join interno in 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 query restituisce il tempo in secondi tra le modifiche di stato per un ordine cliente.

I nomi e le date degli stati vengono inseriti dinamicamente nella query.

Modifica: Ho appena provato questo

"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 ricevuto l'eccezione " il join esterno o completo deve essere seguito dall'espressione del percorso "

È stato utile?

Soluzione

In genere i join HQL vengono specificati utilizzando la proprietà sull'oggetto, ad esempio, se la classe Foo and Bar e Foo.bar è di tipo Bar, quindi da Foo f inner join f.bar come b è il join. Per quanto ne so, non c'è modo di eseguire un self-join in HQL (potrei sbagliarmi qui).

Detto questo, Hibernate ti permette di scrivere query SQL (leggermente migliorate) con session.createSQLQuery (...) .

Altri suggerimenti

Ha finito per cambiare per usare SQL nativo e un PreparedStatement in quanto sembra che session.createSQLQuery () di Hibernate funzionerà solo per entità gestite.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top