javax.persistence.NoResultException:getSingleResult()未检索到任何实体

javax.persistence.NoResultException:getSingleResult()未检索到任何实体,java,exception,ejb,Java,Exception,Ejb,我用ejb创建了一个namedquery来检查是否使用了用户名。 当singleResult为null时,我得到以下异常: javax.persistence.NoResultException: getSingleResult() did not retrieve any entities 但是当用户名是免费的时,这个异常就是我想要的结果 代码如下: public User getUserByUsername(String username) throws DAOException{

我用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,并且没有异常


非常感谢

您似乎在catch块中使用语句
throweexception(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;
    }
}

方法
throweexception
的作用是什么


是否在其中引发异常,但您正在使用先前异常的消息?

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

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


此外,如果找不到用户,我不会返回“[null]”,而是抛出一个选中的UserNotFoundException(待定义)。但这取决于要实现的方法的约定。

Michael说:“您可以在catch子句中捕获NoResultException,因为当JPA抛出NoResultException时,事务不会标记为回滚。“。看起来对于某些jpa实现,NoResultException将rollbak事务,这违反了jpa规范,根据本文:

在try-Catch块中捕获NoResultException,并根据您的要求进行处理,例如返回空值

以下链接详细介绍了try-catch的示例:

如果您的应用程序使用Spring Roo,投票最多的答案无效:异常被方面捕获,您永远无法获得所需的
NoResultException

解决此问题的唯一方法是使用
getResultList
,并检查结果
列表中的一个或多个结果是否为零,如投票数第二高的答案所述。

完美。非常感谢。您能否详细说明:“因为它是runtimeexception”catch exception“不适合”…为什么不呢?这应该是首选答案,因为它避免了异常处理块,在这种情况下,JPA似乎将异常处理块强加于客户端。Guava的Iterables类,特别是getFirst方法,显示了如何避免非异常情况的异常:getFirst'返回iterable或defaultValue中的第一个元素,如果iterable是空的。
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;
        }