Сравнение строк JPA - PullRequest
5 голосов
/ 09 ноября 2011

Я написал простую систему входа в систему с использованием запроса JPQL, который всегда не дает результата:

public boolean check(String name, String password) {
    final String qstring="SELECT e FROM Muser e WHERE e.name = '"+name+"'";
    Muser user;
    try{
        user = em.createQuery(qstring, Muser.class).getSingleResult();  
    }
    catch(NoResultException e){
        return false;
    }
    return password.equals(user.getPassword());
}

Когда я изменил его на собственный запрос:

user = (Muser) em.createNativeQuery(qstring, Muser.class).getSingleResult();

или выражение типа int:

final String qstring="SELECT e FROM Muser e WHERE e.id = "+id; 

Все идет хорошо. В чем проблема? Спасибо миллион!

Ответы [ 2 ]

3 голосов
/ 09 ноября 2011

Возможно, проблема связана со сравнением строк в вашем JPA-провайдере.Вы проверяете его на данных с учетом регистра?

Вы также можете попробовать (и это предпочтительный способ) , используя параметры вместо того, чтобы создавать свое утверждение вручную.Это не только безопаснее (предотвращает внедрение SQL), но также быстрее : не только для Java (вы не объединяете строки), но и для БД (запрос может быть подготовлен один раз длявсе казни).Это может быть что-то вроде этого:

final String qstring = "SELECT e FROM Muser e WHERE e.name = :name";
TypedQuery<Muser> query = em.createQuery(qstring, Muser.class);
query.setParameter("name", name);
user = query.getSingleResult();
1 голос
/ 08 сентября 2015

Я думаю, что проблема из-за сравнения строк. Мое решение этой проблемы:
с использованием строчных букв для сравнения.

final String qstring = "SELECT e FROM Muser e WHERE LOWER(e.name) = :name";
TypedQuery<Muser> query = em.createQuery(qstring, Muser.class);
query.setParameter("name", name.toLowerCase());
user = query.getSingleResult();
...