2010-10-06 72 views
2

我有一个查询建造与EntityManagerJPA查询例外

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中创建 查询时发生异常 :
异常 说明:语法错误解析 查询[S ELECT * FROM:表WHHER username =:username AND password = MD5(:password)],line 1,column 7: unexpected token [*]。

如何解决?

在查询中不可能使用*吗?

回答

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

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(); 

,带选择,你可以这样做:

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()) 
    ; 
+0

这JPA规范的一部分,说:“选择”是可选的?特别是,在JPA2规范的第4.2.1节中,我们有“select_statement :: = select_clause from_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause]”“select_clause”根本不是可选的 – DataNucleus 2010-10-06 10:17:41

+0

我不知道规格。但是,如果你想要一个'select * from',那么你不需要输入SELECT。你可以写FROM。也许是支持这个的hibernate,而不是专门的jpa。 – 2010-10-06 10:26:57