#java #jpa #jakarta-ee #java-ee-6
#java #jpa #джакарта-ee #java-ee-6
Вопрос:
Я хочу входить в систему своих пользователей, только если их учетная запись активирована, но по какой-то причине запрос, который должен вернуть мне пользователя (я называю это Role в моей программе) при предоставлении правильных учетных данных, вообще ничего не возвращает.
Я на 100% уверен, что учетные данные верны, также я уверен, что в базе данных нет дубликатов и синтаксис запроса правильный.
Итак, почему этот метод внутри одного из моих EJB не возвращает true?:
// Checks if the account is not activated!
public boolean isActivated(String email, String password) {
// 1-Send query to database to see if that user exist
Query query = em
.createQuery("SELECT r FROM Role r WHERE r.email=:emailparam AND r.password=:passwordparam");
query.setParameter("emailparam", email);
query.setParameter("passwordparam", password);
List<Object> tmpList = query.getResultList();
if (tmpList.isEmpty() == false) {
System.out.println("IS NOT EMPTY");
Role role = (Role) tmpList.get(0);
if (role.getAccountStatus().trim()
.equalsIgnoreCase(AccountStattus.ACTIVATED.toString())) {
// The account is activated!
System.out.println("ACTIVATED!!!!!!!");
return true;
}
}
// The account is not activated!
System.out.println("NOT ACTIVATED!!!!!!!");
return false;
}
Единственное сообщение, которое я вижу в консоли, НЕ АКТИВИРОВАНО !!!!
Обновить
Чтобы подтвердить, что список пуст на 100%, я изменил свой код, чтобы он выглядел следующим образом:
// Checks if the account is not activated!
public boolean isActivated(String email, String password) {
// 1-Send query to database to see if that user exist
System.out.println("HERE:" email password);
Query query = em
.createQuery("SELECT r FROM Role r WHERE r.email=:emailparam AND r.password=:passwordparam");
query.setParameter("emailparam", email);
query.setParameter("passwordparam", password);
List<Object> tmpList = query.getResultList();
Iterator<Object> it = tmpList.iterator();
int elements = 0;
while(it.hasNext()) {
elements ;
}
if (elements > 0) {
System.out.println("IS NOT EMPTY");
Role role = (Role) tmpList.get(0);
if (role.getAccountStatus().trim()
.equalsIgnoreCase(AccountStattus.ACTIVATED.toString())) {
// The account is activated!
System.out.println("ACTIVATED!!!!!!!");
return true;
}
}
// The account is not activated!
System.out.println("NOT ACTIVATED!!!!!!!");
return false;
}
Метод по-прежнему возвращает false, когда я ввожу правильные учетные данные. Что не так?
Комментарии:
1. Какой тип «r ИЗ роли»? Может ли ваш запрос ничего не возвращать?
2. Вы проверили, какая инструкция SQL создана, и протестировали ли вы ее непосредственно в базе данных?
3. Имя таблицы — «Роль». Оператор return ничего не возвращает, но я предоставляю правильные учетные данные, и я не понимаю, почему он не возвращает true
4. @The Elite Gentelman Я сделал то, что вы говорите, но это то, что говорит консоль:
Syntax error parsing the query [SELECT * FROM Role r WHERE r.email=:emailparam AND r.password=:passwordparam], line 1, column 7: unexpected token [*].
5. @sfrj, извините, моя ошибка. Я перепутал SQL с JPQL. Я удалил свой комментарий.
Ответ №1:
Шаги по отладке,
- Запустите тот же запрос, используя любой SQL-клиент
- Проверьте свой
Role
класс. У него должны быть свойстваemail
иpassword
с соответствующими параметрами получения / установки
И, пожалуйста, не говорите мне, что пароль в базе данных является hashed-version
.
Несколько основных предложений по рефакторингу,
-
Напишите свой запрос таким образом, чтобы он был удобен для восприятия,
Query query = em.createQuery("from Role r where r.email=:email and r.password=:password") .setParameter("email", email) .setParameter("password", password);
-
Измените свое условие на это,
if (!list.isEmpty()) {...}
Комментарии:
1. Я исправил свою проблему после небольшой отладки. Похоже, что параметр password был потерян по пути. Запрос был выполнен нормально, но учетные данные были неверными при поступлении в EJB. Спасибо!
2. @sfrj: Рад, что это сработало. Но почему был потерян
password
параметр, а не3. Ничего особенного. Я использую управляемый компонент, чтобы получить пароль из интерфейса и обработать его заново. Я произвел некоторые манипуляции со строками, чтобы удалить пробелы, но я не обрезал () в конце. Итак, пароль был неправильным. Я не мог видеть, что он не был обрезан в консоли, поскольку я не вижу пробелов в конце слов 🙂 Немного глупо с моей стороны, вероятно, во время вчерашнего рефакторинга я создал проблему.
Ответ №2:
Ваш список запросов должен быть пустым. Это либо проблема с базой данных, к которой вы подключены (возможно, не с той, которую, по вашему мнению, вы используете), запросом, параметрами или базой данных.
Комментарии:
1. Да, список пуст, это точно, поскольку условие
if (tmpList.isEmpty() == false)
не оценивается как true. Я уверен на 100%, что база данных верна, потому что я могу правильно регистрировать пользователей и вижу данные, вставленные в БД.