2010-10-06 101 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