更新-查看评论中的答案

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

这将返回我的结果,该结果按主要标志降序排列,首先为null,忽略按姓氏排序。

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

我同时获得了主要和姓氏排序,但由于它是Oracle数据库,因此仍然首先以null结尾。

我非常惊讶,当我添加NULLS LAST时没有抛出错误消息,我希望通过一些语法调整,我能够使它接受NULLS LAST请求。

最佳答案

一位同事为我提供了一种解决方法。仍然不知道为什么查询会忽略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”或null。使用nvl我使用'N'代替null。

关于java - JPQL Hibernate NULLS LAST被忽略,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16304352/

10-09 00:16