Исключение запроса JPA - PullRequest
       13

Исключение запроса JPA

2 голосов
/ 06 октября 2010

У меня есть запрос, построенный с EntityManager:

Query q = em
    .createQuery("SELECT * FROM :table WHERE username = :username AND password = MD5(:password)")
    .setParameter("table", User.class.getName())
    .setParameter("username", txtLogin.getText())
    .setParameter("password", passPassword.getPassword())
;

User user = (User) q.getSingleResult();

, но я получаю исключение:

Исключение в потоке "AWT-EventQueue-0" java.lang.IllegalArgumentException: при создании запроса в EntityManager возникла исключительная ситуация:
Описание исключения: синтаксическая ошибка при разборе запроса [SELECT * FROM: таблица WHERE имя пользователя =: имя пользователя и пароль = MD5 (: пароль)], строка 1, столбец 7: неожиданный токен [*].

Как это исправить?

Нельзя ли использовать * в запросах?

Ответы [ 2 ]

7 голосов
/ 06 октября 2010

Синтаксис JPQL отличается от SQL, вы делаете

Select T from Thingy T

вместо

Select * from Thingy

Но это только часть вашей проблемы.SELECT t FROM :table t также не будет работать, так как параметры не разрешены в предложении from, но только в предложении where.Так что вы должны сделать это примерно так:

Query q = em
    .createQuery("SELECT u FROM " + User.class.getName()
    + "u WHERE username = :username AND password = MD5(:password)")
    .setParameter("username", txtLogin.getText())
    .setParameter("password", passPassword.getPassword())
    ;

Кроме того, в JPQL нет функции MD5(), поэтому для использования MD5 вы должны сделать это в коде Java или использовать собственный запрос SQL.

0 голосов
/ 06 октября 2010

Да, вы не можете использовать * таким образом.

Вот как это сделать.Обратите внимание, что даже SELECT является необязательным

 Query q = em
    .createQuery("FROM " + User.class.getName() + " WHERE username = :username AND password = MD5(:password)")
    .setParameter("username", txtLogin.getText())
    .setParameter("password", passPassword.getPassword())
    ;

User user = (User) q.getSingleResult();

С помощью SELECT вы можете сделать так:

Query q = em
    .createQuery("SELECT us FROM " + User.class.getName() + "us WHERE username = :username AND password = MD5(:password)")
    .setParameter("username", txtLogin.getText())
    .setParameter("password", passPassword.getPassword())
    ;
...