9

已更新 - 请参阅评论中的答案

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

这将返回按主标志降序排序的结果,首先是空值,忽略姓氏排序。

如果我这样做:

      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 请求。

4

1 回答 1

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。

于 2013-06-07T20:37:49.787 回答