2013-04-06 3 views
0

Я пытаюсь создать веб-приложение в первый раз, и я использую всевозможные учебники и помощь любого рода, но я не понимаю, почему это происходит. Все работало до сих пор:IndexOutOfBounds при выполнении NamedQuery дважды

Я пытаюсь передать атрибут «Пользователь» между сервлетами, и я делаю это, отправив часть его в качестве атрибута (используя 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) 

в первый раз я использую это, она работает, и я получаю ожидаемый результат, но если я вернусь к тому же сервлету или снова использую тот же код в другой сервлет, я получаю java.lang.IndexOutOfBoundsExpcetion: Index: 0, Size: 0

Как это может произойти, если я не изменял базу данных в любой момент?

Любая помощь будет оценена по достоинству.

ответ

0

Похоже, что ваш атрибут запроса «txt» равен нулю во второй раз. Это атрибут запроса, поэтому он будет действителен только во время запроса. Если вы не храните его и не отправляете его каждый раз, когда он будет пустым.

Пустым именем пользователя будет пустой список. Попытка прочитать первый элемент пустого списка вызывает исключение IndexOutOfBoundsException.

Используйте атрибут сеанса или повторно отправляйте атрибут каждый раз, и он будет работать.

Смежные вопросы