我用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并且没有得到异常。
非常感谢
答案 0 :(得分:32)
您似乎使用语句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;
}
}
答案 1 :(得分:11)
改为使用getResultList
并检查List
是否为空(零元素)。否则,列表包含一个元素,您只需返回它。
答案 2 :(得分:3)
您在调用getSingleResult时遇到已定义的行为,但未找到任何条目:抛出NoResultException。您可以在catch子句中捕获NoResultException,因为当JPA抛出NoResultException时,事务不会被标记为回滚。或者你可以使用getResultList()并检查大小是否正好是“1”,这样你就知道你找到了你的用户。
此外,如果找不到用户,我不会返回“[null]”,而是抛出一个已检查的UserNotFoundException(待定义)。但这取决于您要实施的方法的合同。
答案 3 :(得分:2)
迈克尔说:“你可以在catch子句中捕获NoResultException,因为当JPA抛出NoResultException时,事务不会被标记为回滚。”对于一些jpa实现来说,根据这篇文章,NoResultException将违反jpa规范的rollbak事务:NoResultException marks transaction rollback
答案 4 :(得分:0)
方法throwException
做了什么?
是否会抛出异常,但您使用的是先前异常的消息?
答案 5 :(得分:0)
在try-catch块中捕获NoResultException并根据您的要求处理它,例如返回空值。
try-catch示例详见以下链接: http://www.javabrahman.com/j2ee/jpa/no-result-exception/
答案 6 :(得分:0)
如果您的应用程序使用Spring Roo,则投票最多的答案不起作用:异常会被方面捕获,您永远无法获得所需的NoResultException
。
解决问题的唯一方法是使用getResultList
并检查生成的List
中的零个,一个或多个结果,如第二个最多投票答案中所述。
答案 7 :(得分:0)
try {
Query queryObj = entityMgrObj
.createQuery("SELECT u FROM UserEntity u WHERE u.email = :email AND u.password = :password");
queryObj.setParameter("email", email);
queryObj.setParameter("password", password);
UserEntity userEntity = (UserEntity) queryObj.getSingleResult();
return userEntity;
} catch (NoResultException e) {
return null;
}