【发布时间】:2013-04-24 15:16:43
【问题描述】:
已更新 - 请参阅评论中的答案
我知道 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 请求。
【问题讨论】:
-
一位同事为我提供了解决方法。仍然不知道为什么查询忽略 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。
-
你应该回答你自己的问题,然后接受答案。
-
谢谢 - 我认为这是我第一次发帖,当时不允许我回答自己的问题,所以我将其添加为评论!