2013-04-30 111 views
9

已更新 - 请参阅回答评论JPQL Hibernate NULLS LAST被忽略

我知道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"; 

我得到初级和姓氏排序,但还是落得空第一,因为它是一个Oracle数据库。

当我添加NULLS LAST时,我大多惊讶地发现没有错误消息,并且我希望通过一些语法调整,我可以让它接受NULLS LAST请求。

+0

一位同事为我提供了一种解决方法。仍然不知道为什么查询忽略NULLS LAST,但我最终使用这个作为我的解决方法: String sql =“SELECT c FROM Contact c WHERE c.partnerCode =:pCode and c.activeFlag ='Y'” \t \t +“ORDER BY nvl(c.primaryFlag,'N')DESC,c.lastName ASC”; 注意:该列的值为'Y','N'或null。使用nvl我使用'N'来代替null。 – headlikearock 2013-04-30 16:51:36

+0

然后你应该回答你自己的问题,并接受答案。 – sharakan 2013-06-07 17:05:41

+0

谢谢 - 我认为那是我的第一篇文章,当时我没有被允许回答我自己的问题,所以我将它添加为评论,而不是! – headlikearock 2013-06-07 20:40:12

回答

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。