javax.persistence. NoResultException: getSingleResult () не получал объектов

я создал namedquery с 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;
    }
}

Делает кто-либо знает, какова проблема.:(

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

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

16
задан ewernli 10 April 2010 в 11:50
поделиться

4 ответа

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

12
ответ дан 30 November 2019 в 15:38
поделиться

Что выполняет ли метод throwException ?

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

0
ответ дан 30 November 2019 в 15:38
поделиться

Похоже, что вы перебрасываете исключение в блоке 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;
    }
}
33
ответ дан 30 November 2019 в 15:38
поделиться

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

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

3
ответ дан 30 November 2019 в 15:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: