2013-04-30 3 views
9

ОБНОВЛЕНО - см ответ в комментарииJPQL Hibernate NULLS ПОСЛЕДНИЙ игнорируется

Я знаю, что CriteriaQuery.orderBy не поддерживает NULLS LAST. Я пытался использовать TypedQuery и заметил, что кажется просто игнорировать все после «NULLS LAST» - не бросать какие-либо ошибки, просто игнорирует:

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

Это возвращает мой результат, заказанный первичным descendings флаг, Сначала нули, игнорируйте сортировку по имени.

Если я это сделать:

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

Я получаю начальную и LastName рода, но до сих пор в конечном итоге с нулям первым, потому что это Oracle DB.

Я был в основном удивлен тем, что не было отправлено сообщение об ошибке, когда я добавил NULLS LAST, и я надеялся, что с некоторыми синтаксическими настройками я смогу заставить его принять запрос NULLS LAST.

+0

Сотрудник предоставил мне обходной путь. Все еще не знаю, почему запрос игнорирует NULLS LAST, но в итоге я использовал это как мой способ: Строка sql = "SELECT c FROM Contact c WHERE c.partnerCode =: pCode и c.activeFlag = 'Y'" \t \t + "ORDER BY nvl (c.primaryFlag, 'N') DESC, c.lastName ASC"; Примечание: значения для столбца были «Y», «N» или «null». Используя nvl, я использую 'N' вместо NULL. – headlikearock

+0

Тогда вы должны ответить на свой вопрос и принять ответ. – sharakan

+0

Спасибо - я думаю, что это была моя первая публикация, и в то время мне не разрешали отвечать на свой вопрос, поэтому я добавил ее вместо комментария! – headlikearock

ответ

2

Сотрудник предоставил обходной путь для меня. До сих пор не знаю, почему запрос игнорирует NULLS LAST, но я в конечном итоге, используя это как мой обходной путь:

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

Примечание: значения столбца были «Y», «N» или нуль. Используя nvl, я использую 'N' вместо NULL.