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();

これにより、プライマリ フラグの降順で並べ替えられた結果が返されます。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 リクエストを受け入れるようになることを期待していました。

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 の使用 null の代わりに「N」を使用しています。

于 2013-06-07T20:37:49.787 に答える