javax.persistence.NoResultException:getSingleResult()没有检索任何实体

我用ejb创建了一个namedquery来检查是否使用了用户名。 当singleResult为null时,我得到以下exception:

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并且没有得到exception。

非常感谢你

您似乎使用语句throwException(username, e);在catch块中重新抛出exceptionthrowException(username, e); 。 如果您希望获得用户或null而没有任何exception,则应如下所示:

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

改为使用getResultList并检查List是否为空(零元素)。 否则,列表包含一个元素,您只需返回它。

迈克尔说:“你可以在catch子句中捕获NoResultException,因为当JPA抛出NoResultException时,事务不会被标记为回滚。” 看起来对于一些jpa实现,NoResultException将会违反jpa规范的rollbak事务,根据这篇文章: NoResultException标记事务回滚

在调用getSingleResult并且未找到任何条目时,您会遇到已定义的行为:抛出NoResultException 。 您可以在catch子句中捕获NoResultException,因为当JPA抛出NoResultException时,事务不会被标记为回滚。 或者你可以使用getResultList()并检查大小是否正好是“1”,这样你就知道找到了你的用户。

另外,如果找不到用户,我不会返回“[null]”,而是抛出一个已检查的UserNotFoundException(待定义)。 但这取决于您要实施的方法的合同。

throwException方法有什么作用?

是否会抛出exception,但您使用的是先前exception的消息?

在try-catch块中捕获NoResultException并根据您的要求处理它,例如返回null值。

try-catch的示例详见以下链接: http : //www.javabrahman.com/j2ee/jpa/no-result-exception/

如果您的应用程序使用Spring Roo,则最多投票的答案不起作用:exception被方面捕获,您永远不会得到所需的NoResultException 。 解决问题的唯一方法是使用getResultList并检查结果List中的零个,一个或多个结果,如第二个最多投票的答案中所述。