回答:
あなたが正しいです。JPA仕様はそれについて何も述べていません。しかし、Java Persistence with Hibernateブック、第2版は次のように述べています。
クエリ結果が空の場合、nullが返されます
結果なしでquery.getResultList()を呼び出すと、Hibernate JPA実装(エンティティマネージャー)はnullを返します。
更新
一部のユーザーが指摘したように、Hibernateの最新バージョンは代わりに空のリストを返すようです。
結果が見つからない場合も、空のリストがEclipselinkに返されます。
if(rows == null || rows.size == 0){}
ここで、rowsはgetResultList()が返すものです
null
空のリストの代わりに返すことは、仕様によって意図されているものではないと信じています。そうしないとnull
、他の場所でいつ期待するかが非常に明確になるからです。特に、getResultList
読み取りに関するドキュメントとしてExecute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the results
。null
もちろん、まだチェックして、必要に応じて空のリストを自分で返します。
もし仕様がそれが起こり得ないと言ったなら、あなたはそれらを信じますか?コードがさまざまなJPA実装に対して実行されると考えられる場合、すべての実装者がそれを正しく実行すると信頼できますか?
何があっても、私は防御的にコーディングしてnullをチェックします。
ここで大きな質問です。「null」と空のリストを同義語として扱う必要がありますか?これは仕様が私たちを助けるべきであり、そうしないことです。
私の推測では、nullの戻り値(実際に発生する可能性がある場合)は「クエリを理解できませんでした」と同じであり、空のリストは「はい、クエリを理解しましたが、レコードがありませんでした」と考えられます。
おそらく、解析不可能なクエリを処理するコードパス(おそらく例外)があります。
Exception
、戻ってnull
どこCollection
戻り値の型であることは明白な設計上の欠陥である
Arthurの投稿とは逆に、エンティティが一致しないクエリを実際に実行すると、nullではなく空のリストが表示されました。これはHibernateを使用しており、私は正しい動作と考えています。エンティティのコレクションを要求しても何もない場合は、空のリストが正しい答えです。
あなたがよく見とる場合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を返すとは思いません。
クラス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です。