更新 - コメントの回答を参照
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 DB であるため、最初は null になります。
NULLS LAST を追加したときにエラー メッセージがスローされなかったことに最も驚きました。構文を微調整することで、NULLS LAST リクエストを受け入れるようになることを期待していました。