Servlets 执行两次NamedQuery时IndexOutOfBounds

Servlets 执行两次NamedQuery时IndexOutOfBounds,servlets,ejb,indexoutofboundsexception,Servlets,Ejb,Indexoutofboundsexception,我第一次尝试制作一个web应用程序,我使用各种各样的教程和帮助,但我不明白为什么会发生这种情况。到目前为止,一切正常: 我试图在servlet之间传输一个“User”属性,我通过将其中的一部分作为属性发送(使用RequestDispatcher或HTML表单),然后在数据库中查找其余部分,如下所示: String user = (String) request.getAttribute("txt"); Users info = (Users) emf.createEntityManager().

我第一次尝试制作一个web应用程序,我使用各种各样的教程和帮助,但我不明白为什么会发生这种情况。到目前为止,一切正常:

我试图在servlet之间传输一个“User”属性,我通过将其中的一部分作为属性发送(使用RequestDispatcher或HTML表单),然后在数据库中查找其余部分,如下所示:

String user = (String) request.getAttribute("txt");
Users info = (Users) emf.createEntityManager().createNamedQuery("Users.findByUsername").setParameter("username",user).getResultList().get(0);
用户名是唯一键,NamedQuery的代码是

@NamedQuery(name = "Users.findByUsername", query = "SELECT u FROM Users u WHERE u.username = :username)
我第一次使用它时,它起作用了,我得到了预期的结果,但是,如果我回到同一个servlet或者在其他servlet中再次使用相同的代码,我会得到
java.lang.IndexOutOfBoundsExpcetion:Index:0,Size:0

如果我没有在任何时候修改数据库,怎么会发生这种情况


任何帮助都将不胜感激。

看起来您的请求属性“txt”第二次为空。它是一个请求属性,因此它仅在请求期间有效。如果您不每次存储或提交它,它将为空

作为用户名的null将生成一个空列表。尝试读取空列表的第一个元素会产生IndexOutOfBoundsException

使用会话属性或每次重新提交该属性,它将起作用