当前位置: 首页 > 知识库问答 >
问题:

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

夏经武
2023-03-14

我正在尝试实现简单的登录系统。我有一个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;
    }
}

实体用户中的命名查询是:

@namedQuery(name="findUserSusUsernameAndPassword", query="SELECT u From User u WHEREu.usernamelike: username ANDu.passwordlike:密码")

共有1个答案

郝永思
2023-03-14

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

如果您想维护您的方法,您必须捕获异常并在没有结果的情况下实现逻辑。

 类似资料:
  • 我刚刚实现了离线数据保存的空间。但在实体类中,我会得到以下错误: 类如下: 提前道谢。

  • 问题内容: 有人可以为我指出一份良好的初学者指南,以安全地运行部分由用户输入构成的SQL查询吗?我正在使用Java,但是语言无关的指南也很好。 期望的行为是,如果有人在GUI中键入类似 数据库应将其视为文字字符串,并安全地存储它而不会删除任何表。 问题答案: 您肯定要使用PreparedStatement。他们很方便。这是一个例子。

  • 我正在创建一个处理库,它需要存储在数据文件夹中的对象和材料文件。这是文件系统: 当我创建我的库时,我有主文件夹和库文件夹(包含jar文件)和包含资产(obj/mtl文件)的数据文件夹。当我导入我的库时,它可以使用我的类和函数(因此它有效),但它找不到目标文件。 处理内置的loadShape函数应该在模型中读取,但只有当数据文件夹与草图位于同一目录中时,它才会在文件中读取,因此库如何将数据文件夹自动

  • 我可以在Spring Boot应用程序中保存实体,而无需。我之所以注意到这一点,是因为在中的方法中添加了之后,我才能够更新实体。 我没有在类级别上注释。在我的服务层中找到的唯一其他位置是不属于方法的方法。我的未扩展。它用注释。我有作为依赖项。我也不是手动开始或提交事务。 员工ontroller.java 员工ervice.java

  • 问题内容: 您将如何配置SWIG .i文件以处理C FILE *类型?下面的函数设置一个文件,以便可以将日志输出写入该文件。我需要从Java类中调用。当前,当我仅将C头文件包含在以下函数中时,SWIG将生成公共静态void setLogFile(SWIGTYPE_p_FILE fd)函数。有任何想法吗? C函数: 我尝试使用以下方法#1并得到以下异常: test.i: 例外: 问题答案: 给定的看

  • 问题内容: 我在数组中呈现对象输入元素的集合。 这使我可以编写onChange处理函数: 但是在此处理程序中,我需要更改的范围对象的ID。因此,我可以更改更改在渲染函数中创建输入元素的方式并更改: 现在,我的处理程序将接收range.id作为参数,但是现在我没有newName值。我可以使用裁判获得它 这是我知道的唯一解决方案,但我怀疑有更好的解决方案。 问题答案: 该参数还通过了,但参数前置到参数