2013-04-30 12 views
9

AKTUALIZACJA - patrz odpowiedź w komentarzuJPQL Hibernate null LAST ignorowane

Jestem świadomy, że CriteriaQuery.orderBy nie obsługuje wartości null ostatni. Starałem się używać TypedQuery i zauważył, że wydaje się, że wszystko po prostu zignorować „null ostatni” - nie rzucać żadnych błędów, po prostu ignoruje go:

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(); 

ta zwraca mój wynik zamówionego przez pierwotnych descendings flagi, najpierw null, ignoruj ​​sortowanie na nazwisko.

Gdybym to zrobić:

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

uzyskać zarówno podstawową i nazwisko rodzaju, ale nadal skończyć z null pierwsze dlatego, że jest to Oracle DB.

Byłem bardzo zaskoczony, że nie pojawił się komunikat o błędzie, gdy dodałem NULLS OSTATNIE i miałem nadzieję, że dzięki kilku poprawkom składni będę w stanie go zaakceptować na żądanie NULLS LAST.

+0

Współpracownik zapewnił mi obejście. Nadal nie wiem, dlaczego kwerenda ignoruje NULLS OSTATNIE, ale skończyłem używać tego jako mojego obejścia: String sql = "WYBIERZ c Z Kontakt c WHERE c.partnerCode =: pCode i c.activeFlag =" Y "" \t \t + "ORDER BY nvl (cprimaryFlag, 'N') DESC, c.lastName ASC"; Uwaga: wartości dla kolumny to "Y", "N" lub zero. Używając nvl używam 'N' zamiast zerowego. – headlikearock

+0

Powinieneś wtedy odpowiedzieć na własne pytanie i zaakceptować odpowiedź. – sharakan

+0

Dzięki - myślę, że to było moje pierwsze ogłoszenie i nie mogłem w tym czasie odpowiedzieć na moje własne pytanie, więc dodałem je jako komentarz! – headlikearock

Odpowiedz

2

Współpracownik zapewnił mi obejście. Nadal nie wiem, dlaczego kwerendy ignoruje wartości null ostatni, ale skończyło się na tym, jak za pomocą mojego obejścia:

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

Uwaga: Wartości dla kolumny były „Y”, „N” lub wartość null. Używając nvl używam 'N' zamiast zerowego.