web-dev-qa-db-ja.com

javax.persistence.NoResultException:getSingleResult()はエンティティを取得しませんでした

ユーザー名が使用されているかどうかを確認するために、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を返し、例外を取得しません。

どうもありがとうございました

16
apple1988

ステートメント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;
    }
}
33
stefanglase

代わりにgetResultListを使用して、Listが空である(要素が0である)かどうかを確認してください。それ以外の場合、リストには1つの要素が含まれており、それを返すだけです。

12
ewernli

getSingleResult を呼び出すときに定義された動作が発生し、エントリが見つかりませんでした: NoResultException がスローされます。 JPAがNoResultExceptionをスローしている場合、トランザクションはロールバックとしてマークされないため、catch-clauseでNoResultExceptionをキャッチできます。または、getResultList()を使用して、サイズが正確に「1」であるかどうかを確認して、ユーザーが見つかったことを確認できます。

さらに、ユーザーが見つからない場合は "[null]"を返さず、チェックされたUserNotFoundException(定義される)をスローします。しかし、これは実装しようとしているメソッドの規約に依存します。

3

Michaelは、「JPAがNoResultExceptionをスローしているときにトランザクションがロールバックとしてマークされないため、catch節でNoResultExceptionをキャッチできます。」と述べています。この記事によると、一部のjpa実装では、NoResultExceptionはjpa仕様に違反するトランザクションをロールバックします。 NoResultExceptionはトランザクションのロールバックをマークします

2
Mike

アプリケーションがSpring Rooを使用している場合、最も投票された回答は機能しません。例外はアスペクトによってキャッチされ、目的のNoResultExceptionを取得できません。この問題を解決する唯一の方法は、getResultListを使用し、2番目に投票された回答に記載されているように、ゼロ、1つ以上の結果をListで確認することです。

1
koke24

メソッドthrowExceptionは何をしますか?

その中で例外がスローされていますが、前の例外のメッセージを使用していますか?

0
JRL

Try-catchブロックでNoResultExceptionをキャッチし、null値を返すなどの要件に従って処理します。

Try-catchの例は、次のリンクで詳しく説明されています。 http://www.javabrahman.com/j2ee/jpa/no-result-exception/

0
Frank