2011-01-19 13 views
6

esiste un modo semplice per gestire l'iniezione SQL in ordine Hibernate HQL per clausola. I parametri nominati ovviamente non funzionano per questo.Gestire l'iniezione SQL in ordine HQL con clausola

EDIT:

Sentitevi liberi di pubblicare il tuo modo di gestire questo problema. Voglio vedere le soluzioni degli altri e insegnare da loro.

Grazie per eventuali suggerimenti e soluzioni.

+0

Perché non utilizzare Nhibere con Linq? – Dave

+0

@Dave Ciao, sto usando Java quindi linq non è accessibile per me. –

+0

Avrei dovuto prenderlo in ibernazione piuttosto che in ibernazione! Buona fortuna risolvendo questo. – Dave

risposta

3

È possibile utilizzare l'API di criteri Hibernate anziché HQL.

I criteri API verificano che il criterio dell'ordine indichi una proprietà valida.

se si cerca someting così:

public void testInjection() { 
    String orderBy = "this_.type desc, type"; 

    Criteria crit = this.getSession().createCriteria(DemoEntity.class); 
    crit.addOrder(Order.asc(orderBy));  
    crit.list(); 
} 

otterrete un QueryException: "could not resolve property this_ of de.test.DemoEntity" lanciata da AbstractPropertyMapping.

+0

Ciao, grazie per la risposta, ma sto lavorando all'esecuzione del progetto in cui non posso passare all'API dei criteri. Quindi sto cercando esattamente ciò che tu punti, ma in HQL. –

0

Hibernate utilizza PreparedStatement che è già in grado di eseguire l'iniezione SQL. In un PreparedStatment, gli argomenti sono associati all'istruzione piuttosto che all'emissione di un'istruzione SQL in testo semplice. Non dovresti aver bisogno di preoccuparti dell'iniezione SQL quando usi l'ibernazione.

Ecco una discussione che assicura che l'ibernazione è sicuro dall'iniezione SQL Click Here.

+0

Sì, è vero, ma se si usa setParameter in PreparedStatment SQL sembra come <... ordina per 'nome' ...> e il risultato non è ordinato, perché dovrebbe apparire come <... nome per nome .. .>. Sto cercando un modo semplice per evitare di gestire alcune tabelle di campi consentiti. –

1

Ho finito con una soluzione che volevo evitare. Ho implementato la mappa dove key è ciò che l'utente vede nell'URL e value è la colonna (s) in DB che è dopo la clausola ORDER BY.