я создал 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;
}
}
Делает кто-либо знает, какова проблема.:(
Я хотел бы возвратить пустой указатель и не получаю Исключение.
Большое спасибо
Используйте ] getResultList
и проверьте, является ли список List
пустым (имеет нулевой элемент). В противном случае список содержит один элемент, и вы просто возвращаете его.
Что выполняет ли метод throwException
?
Выдается ли в нем исключение, но вы используете сообщение предыдущего исключения?
Похоже, что вы перебрасываете исключение в блоке 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;
}
}
Вы испытываете определенное поведение при вызове getSingleResult и не было найдено ни одной записи: генерируется исключение NoResultException . Вы можете поймать NoResultException в предложении catch, потому что транзакция не будет помечена как откат, когда JPA выбрасывает NoResultException. Или вы можете использовать getResultList () и проверить, равен ли размер «1», чтобы вы знали, что нашли своего пользователя.
Кроме того, я бы не вернул «[null]», если пользователь не найден, а выбросил бы проверенное исключение UserNotFoundException (будет определено). Но это зависит от контракта метода, который вы собираетесь реализовать.