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

时间:2010-04-10 10:55:39

标签: java exception ejb

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

非常感谢

8 个答案:

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