ユーザー名が使用されているかどうかを確認するために、ejbでnamedqueryを作成しました。 singleResultがnullの場合、次の例外が発生します。
javax.persistence.NoResultException: getSingleResult() did not retrieve any entities
しかし、この例外は、ユーザー名が無料の場合に必要な結果です。
これがコードです:
public User getUserByUsername(String username) throws DAOException{
try{
Query q = em.createNamedQuery(User.getUserByUsername);
q.setParameter("username", username);
return (User) q.getSingleResult();
}catch(Exception e){
throwException(username, e);
return null;
}
}
誰もが問題が何であるかを知っていますか? :(
Nullを返し、例外を取得しません。
どうもありがとうございました
ステートメントthrowException(username, e);
を使用して、catchブロックで例外を再スローしているようです。ユーザーまたはnull
を例外なく取得すると予想される場合、これは次のようになります。
public User getUserByUsernameOrNull(String username) {
try{
Query q = em.createNamedQuery(User.getUserByUsername);
q.setParameter("username", username);
return (User) q.getSingleResult();
} catch(NoResultException e) {
return null;
}
}
代わりにgetResultList
を使用して、List
が空である(要素が0である)かどうかを確認してください。それ以外の場合、リストには1つの要素が含まれており、それを返すだけです。
getSingleResult を呼び出すときに定義された動作が発生し、エントリが見つかりませんでした: NoResultException がスローされます。 JPAがNoResultExceptionをスローしている場合、トランザクションはロールバックとしてマークされないため、catch-clauseでNoResultExceptionをキャッチできます。または、getResultList()を使用して、サイズが正確に「1」であるかどうかを確認して、ユーザーが見つかったことを確認できます。
さらに、ユーザーが見つからない場合は "[null]"を返さず、チェックされたUserNotFoundException(定義される)をスローします。しかし、これは実装しようとしているメソッドの規約に依存します。
Michaelは、「JPAがNoResultExceptionをスローしているときにトランザクションがロールバックとしてマークされないため、catch節でNoResultExceptionをキャッチできます。」と述べています。この記事によると、一部のjpa実装では、NoResultExceptionはjpa仕様に違反するトランザクションをロールバックします。 NoResultExceptionはトランザクションのロールバックをマークします
アプリケーションがSpring Rooを使用している場合、最も投票された回答は機能しません。例外はアスペクトによってキャッチされ、目的のNoResultException
を取得できません。この問題を解決する唯一の方法は、getResultList
を使用し、2番目に投票された回答に記載されているように、ゼロ、1つ以上の結果をList
で確認することです。
メソッドthrowException
は何をしますか?
その中で例外がスローされていますが、前の例外のメッセージを使用していますか?
Try-catchブロックでNoResultExceptionをキャッチし、null値を返すなどの要件に従って処理します。
Try-catchの例は、次のリンクで詳しく説明されています。 http://www.javabrahman.com/j2ee/jpa/no-result-exception/