javax.persistence.Query.getResultList()はnullを返すことができますか?


115

もしそうなら、どのような状況で?

JavadocとJPAの仕様には何も書かれていません。


私はまさにこの質問を探していました!tks!4つまで!
rafa.ferreira

回答:


69

あなたが正しいです。JPA仕様はそれについて何も述べていません。しかし、Java Persistence with Hibernateブック、第2版は次のように述べています。

クエリ結果が空の場合、nullが返されます

結果なしでquery.getResultList()を呼び出すと、Hibernate JPA実装(エンティティマネージャー)はnullを返します。

更新

一部のユーザーが指摘したように、Hibernateの最新バージョンは代わりに空のリストを返すようです。

結果が見つからない場合も、空のリストがEclipselinkに返されます。


29
これは確かに時代遅れであり、Hibernateは空のリストを返します。
Michael Laffargue 2013年

2
Hibernate 4.3.10(Spring DataのJPAエンジンとして実行中)からnullが引き続き取得されます。通常のJPAクエリは期待どおりに機能するため、これは単一のネイティブクエリでのみ発生します。
Jacek Prucia

1
ORを使用して両方の条件を確認してください。if(rows == null || rows.size == 0){}ここで、rowsはgetResultList()が返すものです
Number945

それをOptional.ofNullable()でラップするだけで設定は完了です。
de.la.ru 2017

null空のリストの代わりに返すことは、仕様によって意図されているものではないと信じています。そうしないとnull、他の場所でいつ期待するかが非常に明確になるからです。特に、getResultList読み取りに関するドキュメントとしてExecute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the resultsnullもちろん、まだチェックして、必要に応じて空のリストを自分で返します。
ルネ

23

もし仕様がそれが起こり得ないと言ったなら、あなたはそれらを信じますか?コードがさまざまなJPA実装に対して実行されると考えられる場合、すべての実装者がそれを正しく実行すると信頼できますか?

何があっても、私は防御的にコーディングしてnullをチェックします。

ここで大きな質問です。「null」と空のリストを同義語として扱う必要がありますか?これは仕様が私たちを助けるべきであり、そうしないことです。

私の推測では、nullの戻り値(実際に発生する可能性がある場合)は「クエリを理解できませんでした」と同じであり、空のリストは「はい、クエリを理解しましたが、レコードがありませんでした」と考えられます。

おそらく、解析不可能なクエリを処理するコードパス(おそらく例外)があります。


+1「あなたはすべてのJPAプロバイダーを信頼しますか?」いいえ:)
dfa 2009

追加のために編集:レコードが見つからない場合、実際にHibernateのJPAはnullを返すことをアーサーは指摘しました。したがって、実際には、この場合、nullと空のリストを一緒に折りたたむ必要があります。私たちが上で経験した思考プロセスはまだ有効であると私は信じています。JPAスタックごとにnullの処理が異なる必要があることも考えられます。ポータビリティの楽しみへようこそ。
djna 2009

同意した。JPA仕様では本来実行すべきことを実行していないため、「移植性の楽しみ」のみが存在します。正確なセマンティクスを指定してください。既得権益を持つ委員会によって運営されているのは残念です。
DataNucleus、

2
「私は、クエリを理解していなかった」として扱われるべきでException、戻ってnullどこCollection戻り値の型であることは明白な設計上の欠陥である
matoni

13

Arthurの投稿とは逆に、エンティティが一致しないクエリを実際に実行すると、nullではなく空のリストが表示されました。これはHibernateを使用しており、私は正しい動作と考えています。エンティティのコレクションを要求しても何もない場合は、空のリストが正しい答えです。


2
OpenJPAの場合、nullではなく空のリストも取得します。
Gnavvy 2011年

3

あなたがよく見とる場合org.hibernate.loader.Loader(4.1)あなたはリストが常にprocessResultSet()メソッド(内部で初期化されていることがわかりますドキュメントソース)。

protected List processResultSet(...) throws SQLException {
   final List results = new ArrayList();

   handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
   ...
   return results;

}

だから今はnullを返すとは思いません。


2
正確なコードスニペットの乾杯。しかし、この回答は、仕様の実装の1つである休止状態にのみ焦点を当てています。OpenJPAなどの他の実装では、動作が異なります。また、hibernateは異なるバージョンで動作を変更したようです。
venky

1

もちろん、JakartaのCollectionUtils.isNotEmptyで結果セットをテストする場合は、どちらの方法でもカバーされます。


0

Query.getResultList()の代わりに空のリストを返しますnull。したがってisEmpty()、返された結果をチェックインし、それがfalseの場合は残りのロジックを続行します。


0

クラスgetResultsList()内の実装を考えると、org.hibernate.ejb.QueryImplを返すことが可能nullです:

public List getResultList() {
    try {
        return query.list();
    }
    catch (QueryExecutionRequestException he) {
        throw new IllegalStateException(he);
    }
    catch( TypeMismatchException e ) {
        throw new IllegalArgumentException(e);
    }
    catch (HibernateException he) {
        em.throwPersistenceException( he );
        return null;
    }

私の休止状態のバージョンは3.3.1.GAです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.