JPA: Как сохранить столбец с шифрованием SHA1? - PullRequest
0 голосов
/ 24 октября 2011

Я довольно новичок в JPA (и JPQL по расширению).Надеюсь, кто-нибудь сможет рассказать мне об этой проблеме.

Запрос, который я пытаюсь выполнить ...

String query = "select u from user u where u.email = '" + userEmail + "' and u.password = sha1('"+ userPassword + "')";
List resultList = emf.createEntityManager().createQuery(query).getResultList();

И я получаю следующее исключение ...

Caused by: Exception [EclipseLink-8025] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query [select u from Utilisateur u where u.email = 'myuser' and u.mot_Passe = sha1('mypassword')], line 1, column 73: unexpected token [(].
Internal Exception: NoViableAltException(83@[()* loopback of 383:9: (d= DOT right= attribute )*])
    at org.eclipse.persistence.exceptions.JPQLException.unexpectedToken(JPQLException.java:372)
...

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

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

Я думаю, что у JPA нет функции sha1. Итак, у вас есть два варианта:

  1. Вы можете реализовать функцию sha1 в своем коде Java и использовать их перед загрузкой параметров в запросе.

    String query = "select u from user u where u.email = :userEmail" +
       " and u.password = :userPassword";
    Query jpqlQuery = em.createQuery(query)
        .setParameter("userEmail", userEmail)
        .setParameter("userPassword",sha1(userPassword));
    
  2. Если в вашей базе данных есть функция sha1, вы можете написать собственный запрос. Проверьте эту ссылку: http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html

    List<Customer> customers = (List<Customer>)em.createNativeQuery
            ("SELECT * FROM customers", jpqlexample.entities.Customer.class)
                          .getResultList(); 
    Iterator i = customers.iterator();
    Customer cust;
    while (i.hasNext()) {
        cust = (Customer) i.next();
        //do something
    }
    
1 голос
/ 24 октября 2011

Задайте параметры через интерфейс Query, а не добавляйте их буквально в строку JPQL.Таким образом, вы также защищаете себя от SQL-инъекции :

String query =
   "select u from user u where u.email = :userEmail"
   + " and u.password = sha1(:userPassword)";
Query jpqlQuery = em.createQuery(query)
    .setParameter("userEmail", userEmail)
    .setParameter("userPassword",userPassword)
0 голосов
/ 24 октября 2011

В EclipseLink вы можете использовать слово запроса FUNC для использования функции, специфичной для базы данных.

"выберите пользователя из списка u, где u.email =: электронная почта и u.password = FUNC ('sha1',:пароль) "

см., http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/Support_for_Native_Database_Functions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...