javax.persistence.NoResultException: getSingleResult () не получил никаких объектов - PullRequest
15 голосов
/ 10 апреля 2010

Я создал именованный запрос с ejb, чтобы проверить, используется ли имя пользователя. Когда singleResult равен нулю, я получаю следующее исключение:

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;
    }
}

Кто-нибудь знает, в чем проблема. (

Я хотел бы вернуть ноль и не получить исключение.

Большое спасибо

Ответы [ 7 ]

32 голосов
/ 10 апреля 2010

Кажется, вы выбросили исключение в блоке catch с помощью оператора throwException(username, e);. Если вы ожидаете получить пользователя или 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;
    }
}
11 голосов
/ 10 апреля 2010

Вместо этого используйте getResultList и проверьте, является ли List пустым (имеет нулевой элемент). В противном случае список содержит один элемент, и вы просто возвращаете его.

3 голосов
/ 10 апреля 2010

Вы испытываете определенное поведение при вызове getSingleResult и ни одна запись не была найдена: выдается NoResultException . Вы можете поймать NoResultException в предложении catch, потому что транзакция не будет помечена как откат, когда JPA генерирует NoResultException. Или вы можете использовать getResultList () и проверить, равен ли размер именно «1», чтобы вы знали, что нашли своего пользователя.

Кроме того, я бы не возвратил «[null]», если пользователь не найден, но выбросил бы проверенное исключение UserNotFoundException (будет определено). Но это зависит от контракта метода, который вы собираетесь реализовать.

2 голосов
/ 06 марта 2011

Майкл сказал: «Вы можете перехватить NoResultException в предложении catch, потому что транзакция не будет помечена как откат, когда JPA генерирует NoResultException». Похоже, что для некоторых реализаций jpa NoResultException выполнит транзакцию rollbak, которая нарушает спецификацию jpa, согласно этой статье: NoResultException отмечает откат транзакции

0 голосов
/ 27 января 2017

Если ваше приложение использует Spring Roo, ответ с наибольшим количеством голосов не работает: исключение отлавливается аспектами, и вы никогда не получите желаемого NoResultException. Единственный способ решить эту проблему - использовать getResultList и проверить на ноль, один или несколько результатов в результате List, как указано во втором ответе с наибольшим количеством голосов.

0 голосов
/ 20 июня 2014

Перехватывает исключение NoResultException в блоке try-catch и обрабатывает его согласно вашему требованию, например, возвращает нулевое значение.

Пример try-catch подробно описан в следующей ссылке: http://www.javabrahman.com/j2ee/jpa/no-result-exception/

0 голосов
/ 10 апреля 2010

Что делает метод throwException?

Исключение выдается внутри него, но вы используете сообщение предыдущего исключения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...