如何在数据库中处理没有输入参数的实体?

时间:2013-12-16 19:48:30

标签: java jpa

我正在尝试实现简单的登录系统。我有一个带有表单的JSP,用户输入用户名和密码,然后是读取这些参数的servlet。您将从servlet代码中理解:

User user = userDao.findUserWithUsernameAndPassword(username, password);
// user found
if (user!=null) {
    session = request.getSession(true);
    session.setAttribute("user", user);
    loginMessage = "Welcome";
    request.setAttribute("loginMessage", loginMessage);
    RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
    dispatcher.forward(request, response);
} else // username and password not matching
    {
    loginMessage = "Wrong username or password! Please try again.";
    request.setAttribute("loginMessage", loginMessage);
    RequestDispatcher dispatcher = request.getRequestDispatcher("login.jsp");
    dispatcher.forward(request, response);
}

如果我输入有效的用户名和密码,这是有效的,但如果不是,我将获得下一个例外:

javax.persistence.NoResultException: Query "SELECT u FROM User u WHERE
u.username like :username AND u.password LIKE :password" selected no
result, but expected unique result.

处理这种情况的正确方法是什么?我想错误的用户名和密码参数来显示相应的消息(转发'loginMessage'变量)。

[已添加]这是UserDAOBean中的代码:

@Stateless
@Local(UserDAOLocal.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class UserDAOBean extends GenericDAOBean<User, Integer> implements UserDAOLocal{

    public User findUserWithUsernameAndPassword(String username, String password)
    {
        Query q = em.createNamedQuery("findUserWithUsernameAndPassword");
        q.setParameter("username", username);
        q.setParameter("password", password);
        User result = (User) q.getSingleResult();
        return result;
    }
}

实体User中的命名查询是:

  

@NamedQuery(name =“findUserWithUsernameAndPassword”,query =“SELECT   u FROM User u WHERE u.username like:username AND u.password LIKE   :密码“)

1 个答案:

答案 0 :(得分:2)

当您调用getSingleResult方法并且没有结果时,实例管理器将抛出此异常,因此您需要更改find​​UserWithUsernameAndPassword方法。 如果您通过它的主键搜索实体,则可以使用em.find,如果没有结果,则该方法返回null。 另一个选项是不使用getSingleResult()并使用getResultList()如果没有结果,它将不会抛出NoResultException,如果没有结果,你需要检查列表是否为空。

如果要维护方法,必须捕获异常并实现没有结果的逻辑。