JPA查询异常

时间:2010-10-06 09:22:14

标签: java mysql orm jpa jpql

我有一个使用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:An   创建时发生异常   在EntityManager中查询:
  例外   描述:语法错误解析   query [SELECT * FROM:table WHERE   username =:username AND password =   MD5(:密码)],第1行,第7列:   意外的令牌[*]。

如何解决?

是否无法在查询中使用*

2 个答案:

答案 0 :(得分:7)

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查询。

答案 1 :(得分:0)

是的,你不能那样使用*

这是怎么做的。请注意,即使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())
    ;