2013-04-30 15 views
9

AGGIORNAMENTO - vedi risposta a un commentoJPQL Hibernate NULLS LAST ignorato

Sono consapevole del fatto che CriteriaQuery.orderBy non supporta NULLS LAST. Stavo cercando di utilizzare un TypedQuery e ho notato che sembra ignorare proprio tutto dopo "NULLS LAST" - non genera errori, semplicemente lo ignora:

String sql = "SELECT c FROM Contact c WHERE c.partnerCode =:pCode and c.activeFlag='Y'" + 
      " ORDER BY c.primaryFlag DESC NULLS LAST, c.lastName ASC"; 

    TypedQuery<Contact> query = em.createQuery(sql, Contact.class); 
    query.setParameter("pCode", partnerCode);  

    return query.getResultList(); 

Questo restituisce il mio risultato in ordine di descendings bandiera primari, prima i null, ignora l'ordinamento sul cognome.

Se faccio questo:

 String sql = "SELECT c FROM Contact c WHERE c.partnerCode =:pCode and c.activeFlag='Y'" + 
      " ORDER BY c.primaryFlag DESC, c.lastName ASC"; 

ottengo sia ordinamento primario e cognome, ma ancora finire con i null in primo luogo perché si tratta di un DB Oracle.

Sono stato in gran parte sorpreso dal fatto che non è stato generato alcun messaggio di errore quando ho aggiunto NULLS LAST e speravo che con alcune modifiche alla sintassi sarei riuscito a farlo accettare la richiesta NULLS LAST.

+0

Un collaboratore mi ha fornito una soluzione alternativa. Ancora non so perché la query ignora NULLS LAST ma ho finito per utilizzare questo come soluzione: String sql = "SELECT c FROM Contatto c WHERE c.partnerCode =: pCode e c.activeFlag = 'Y'" \t \t + "ORDER BY nvl (c.primaryFlag, 'N') DESC, c.lastName ASC"; Nota: i valori per la colonna erano "Y", "N" o null. Usando nvl sto usando 'N' al posto di null. – headlikearock

+0

Dovresti rispondere alla tua domanda e accettare la risposta. – sharakan

+0

Grazie - Penso che sia stato il mio primo post e non mi è stato permesso di rispondere alla mia domanda in quel momento, quindi l'ho aggiunto come commento, invece! – headlikearock

risposta

2

Un collaboratore mi ha fornito una soluzione. Ancora non si conosce il motivo per cui la query ignora NULLS ultimo, ma ho finito per usare questo come la mia soluzione:

String sql = "SELECT c FROM Contact c WHERE c.partnerCode =:pCode and c.activeFlag='Y'"    
+" ORDER BY nvl(c.primaryFlag, 'N') DESC, c.lastName ASC"; 

Nota: i valori per la colonna erano 'Y', 'N' o nullo. Usando nvl sto usando 'N' al posto di null.