更新 - 请参阅评论中的答案
我知道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请求。
答案 0 :(得分: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”或null。使用nvl我使用'N'代替null。