16

JPA 1.0 EntityManager で、find を介してオブジェクトを取得するときに、見つからない場合は null を処理する必要がありますが、createQuery を介して Query インターフェイスを使用すると、見つからない場合に getResultList が NoResultException をスローする本質的な理由を教えてください。

多分私は何かが欠けているかもしれませんが、言語には非常に一貫性がないと感じています。実際には、クエリインターフェイスを使用して単純なファインダーからよりきめ細かいクエリに変更したため、多くの再設計を行う必要がありました。

みんなありがとう。

4

4 に答える 4

26

クエリを使用して、単一の行の単一の列の値を含むほとんどすべてを取得できます。

が null を返す場合getSingleResult()、クエリがどの行にも一致しなかったのか、またはクエリが行に一致したが、選択された列の値として null が含まれているのかどうかを判断できませんでした。

于 2012-08-28T08:58:56.727 に答える
9

検索を行うと、jpa は主キーを使用してエンティティ オブジェクトを見つけます。多くの場合、第 2 レベルのキャッシュが使用され、通常は createQuery や getSingleResult よりもはるかに高速です。

null を取得するか、find から Object を取得します。createQuery を実行すると、Query オブジェクトのインスタンスが作成されます。getResultList を実行すると NoResultException はスローされず、getSingleResult を実行した場合にのみその例外がスローされます。getResultList を実行して何も見つからない場合は、null が返されます。

于 2009-10-18T19:33:44.067 に答える
2

また、NoResultException は、weblogic 10.3.2 でロールバックされたトランザクションをマークします。

この記事を参照してください: NoResultException はトランザクションのロールバックをマークします

于 2011-02-17T18:33:11.440 に答える
-1

私はそれがこのヌルチェックを排除すると思います:

Object o = q.getSingleResult();
if (o != null)
  return (MyObj) o;
return o;

RuntimeException (NoResultException) を導入することで、プログラマーは安全に q.getSingleResult() を MyObj にキャストし、例外を呼び出し元に任せることができます。

q.getResultList() に関しては、常に list を返すため、null チェックは必要ありません。

しかし、私はまだこれが直感的ではないと感じています。

于 2011-03-10T21:08:02.860 に答える