2011-11-15 22 views
32

この質問を投稿する前に、私はすでにthisを見ましたが、私が探していたものを得ることができませんでした。javax.persistence.NoResultException:クエリのエンティティが見つかりません

私が書いた質問に対して、1つの行しか存在しないか、まったく存在しないことがあります。だから、私がgetResultList()を使用する理由はありません。

は、ここに私のコードです:何の行が存在しない場合

String hql="from DrawUnusedBalance where unusedBalanceDate= :today"; 
Query query=em.createQuery(hql); 
query.setParameter("today",new LocalDate()); 

DrawUnusedBalance drawUnusedBalance= 
    (DrawUnusedBalance)query.getSingleResult();// we can have only a 
               // single datum per day 
//`System.out.println(drawUnusedBalance.toString());` 

問題はあるが、それは例外をスローし、そうでない場合、それが正常に動作します。私は問題を知っているが、私は最高の解決策も探している。

DBに行がない場合は、(例外を取得する代わりに)nullオブジェクトを取得したかったので、新しいデータを挿入します。ヌルでない場合は、更新したいだけですそれ。

これを処理する方法が1つありますが、正しい方法ではないと思います。それは:私はtry-catchブロックを持ち、例外をスローすると、catchブロックのDBに新しいデータを挿入するように書くことができます。しかし、私はより良い方法があると信じています。

答えて

60

はい。 try/catchブロックを使用する必要がありますが、Exceptionをキャッチする必要はありません。 APIによると、結果が出ない場合はNoResultExceptionが投げられ、それをどのように扱うかはあなた次第です。

DrawUnusedBalance drawUnusedBalance = null; 
try{ 
drawUnusedBalance = (DrawUnusedBalance)query.getSingleResult() 
catch (NoResultException nre){ 
//Ignore this because as per your logic this is ok! 
} 

if(drawUnusedBalance == null){ 
//Do your logic.. 
} 
+0

ありがとうManuPK ...しかし、私はまだオブジェクトを作成しているDBを行ういくつかのコードを書く必要があります..キャッチブロック....と私はキャッチブロックからデータを保持するための良い方法ではないと思った...あなたの応答のためのtnx。 – WowBow

+1

**チェックされた例外**をキャッチして別のパスをとるのに間違いはないと感じます。それがJPAがあなたにそれをどう扱うかというオプションを与える理由です。実際に探しているメソッドはJPAで利用できない[hibernate](http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/Query.html#uniqueResult())で利用できます。 – ManuPK

+0

@ user1017111 **キャッチ**の中にコードを書く際に問題があります。私はコードを読みやすくするために答えを少し更新しました。 – ManuPK

6

あなたがリストを使用してサイズをチェックすることができUniqueResult(それゆえ例外)があることを知らないので、あなたは、クエリからの結果リストを取得言及?

if (query.list().size() == 1) 

一意のオブジェクトを取得するためにget()を実行していないので、uniqueResultまたはlistを呼び出しても問合せは実行されます。

+0

現在、私はquery.list()。isEmpty()を使用して、返されたデータがあるかどうかを確認しています。get()メソッドのようにnullオブジェクトを取得していればプログラマにとっては簡単だと思いました。ありがとう – WowBow

+0

問題ありません。 IsEmptyは明らかに私が私の答えを書いたときの意味だった;) –

+0

..私はそれを得た。場合によっては代替方法があることが良い場合があります – WowBow

2

結果が不明な場合は、getResultList()を使用してください。 Javaの8を使用する場合

List<User> foundUsers = (List<User>) query.getResultList(); 
     if (foundUsers == null || foundUsers.isEmpty()) { 
      return false; 
     } 
User foundUser = foundUsers.get(0); 
+0

コードが質問にどのように答えているか説明してください。 – jxh

+0

OK、それは答えではなく、示唆です。しかし、他の人にとって役に立つかもしれません。 – ACV

+0

結果があるかどうかわからないときは、getResultList()を使用してください。 (リスト) if(foundUsers == null || foundUsers.isEmpty()){ falseを返します。 } ユーザーfoundUser = foundUsers.get(0); ' – ACV

5

、あなたはすべて、ストリームAPIを利用して、あなたの代わりにnullを好む場合は、あなたにjava.util.Optional

を与えること

return (YourEntityClass) entityManager.createQuery() 
.... 
.getResultList() 
.stream().findFirst(); 

にコードを簡素化することあなたが必要です

... 
.getResultList() 
.stream().findFirst().orElse(null); 
関連する問題