Почему я не могу получить список результатов из запроса? - PullRequest
0 голосов
/ 26 апреля 2011

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

Я на 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, когда я ввожу правильные учетные данные.Что не так?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Шаги для отладки,

  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()) {...}
    
0 голосов
/ 26 апреля 2011

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

...