Почему я не могу получить список результатов из запроса?

#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:

Шаги по отладке,

  1. Запустите тот же запрос, используя любой SQL-клиент
  2. Проверьте свой Role класс. У него должны быть свойства email и password с соответствующими параметрами получения / установки

И, пожалуйста, не говорите мне, что пароль в базе данных является hashed-version .

Несколько основных предложений по рефакторингу,

  1. Напишите свой запрос таким образом, чтобы он был удобен для восприятия,

     Query query = em.createQuery("from Role r where r.email=:email and r.password=:password")
                    .setParameter("email", email)
                    .setParameter("password", password);
      
  2. Измените свое условие на это,

     if (!list.isEmpty()) {...}
      

Комментарии:

1. Я исправил свою проблему после небольшой отладки. Похоже, что параметр password был потерян по пути. Запрос был выполнен нормально, но учетные данные были неверными при поступлении в EJB. Спасибо!

2. @sfrj: Рад, что это сработало. Но почему был потерян password параметр, а не email ? Просто любопытно.

3. Ничего особенного. Я использую управляемый компонент, чтобы получить пароль из интерфейса и обработать его заново. Я произвел некоторые манипуляции со строками, чтобы удалить пробелы, но я не обрезал () в конце. Итак, пароль был неправильным. Я не мог видеть, что он не был обрезан в консоли, поскольку я не вижу пробелов в конце слов 🙂 Немного глупо с моей стороны, вероятно, во время вчерашнего рефакторинга я создал проблему.

Ответ №2:

Ваш список запросов должен быть пустым. Это либо проблема с базой данных, к которой вы подключены (возможно, не с той, которую, по вашему мнению, вы используете), запросом, параметрами или базой данных.

Комментарии:

1. Да, список пуст, это точно, поскольку условие if (tmpList.isEmpty() == false) не оценивается как true. Я уверен на 100%, что база данных верна, потому что я могу правильно регистрировать пользователей и вижу данные, вставленные в БД.