2009-07-12 12 views

答えて

57

あなたは正しいです。 JPA仕様には何も言われていません。しかし、Hibernateの本、第2版、とれるJava Persistenceは言う:

クエリ結果が空の場合は、クエリを呼び出すときに、nullが

にHibernate JPA実装(エンティティマネージャ)はnullを返します.getResultList()結果なし。

UPDATE

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

+19

これは時代遅れですが、Hibernateは空のリストを返します。 –

+4

どのバージョン以来ですか? – Tom

+1

私はまだHibernate 4.3.10(Spring DataのJPAエンジンとして動作しています)からnullを取得しています。これは、通常のJPAクエリーが期待通りに機能するため、単一のネイティブ・クエリーでのみ発生します。 –

20

スペックが起こっていないと言われたら、あなたはそれを信じますか?あなたのコードが異なるJPAの実装で実行される可能性があることを考えれば、すべての実装者がそれを正しく取得すると信じていますか?

何が問題でも、私は防御的にコードし、ヌルをチェックします。

大きな質問:私たちは "null"と空リストを同義語として扱うべきですか?これはスペックが私たちを助けなければならない場所です。

私の推測では、nullリターン(実際に起こる可能性がある場合)は「私はクエリを理解できませんでした」となり、空のリストは「はい、クエリを理解しましたがレコードはありませんでした。

おそらく、解析できないクエリを処理するコードパス(おそらく例外)があるとしたら、そのパスのnullリターンを指示する傾向があります。

+0

+1「あなたはすべてのJPAプロバイダを信頼しますか? NO :) – dfa

+0

編集:Arthurは、レコードが見つからない場合、HibernateのJPAが実際にnullを返すことを指摘しています。実際、この場合、nullと空のリストを一緒に折り畳む必要があります。私は上記の考え方がまだ有効であると考えています。 JPAスタックごとに異なるnullの処理が必要なことも考えられます。携帯性の楽しさへようこそ。 – djna

+0

合意。 JPAの仕様には、正確なセマンティクスを指定する必要のないことがないため、「移植性の楽しみ」しか存在しません。既得権益を持つ委員会によって運営されていることを恥ずかしく思う。 – DataNucleus

13

アーサーのポストとは対照的に、実際にエンティティが一致しないクエリを実行したとき、空のリストが得られました。ヌルではありません。これはHibernateを使用しており、正しい振る舞いとみなしています。空のリストは、エンティティのコレクションを要求しても何もないときに正しい答えです。

+2

、nullの代わりに空のリストも取得します。 – Gnavvy

1

もちろん、JakartaのCollectionUtils.isNotEmptyを使用して結果セットをテストすると、いずれかの方法でカバーされます。

1

org.hibernate.loader.Loader(4.1)をよく見ると、processResultSet()メソッド(docsource)内でリストが常に初期化されていることがわかります。

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

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

} 

だから、今はnullを返すとは思わない。

+2

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

関連する問題