2

我有一个查询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 :table WHERE username = :username AND password = MD5( :password)],第 1 行,第 7 列:意外令牌 [*]。

如何解决?

是不是不能*在查询中使用?

4

2 回答 2

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

于 2010-10-06T09:27:59.640 回答
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())
    ;
于 2010-10-06T09:29:37.467 回答