2016-12-03 32 views
0

我的項目設置是Spring MVC的,Hibernate的4.3.8.Final,PostgreSQL的數據庫,並得到以下錯誤:QueryParameterException無法找到命名爲無實體參數

org.hibernate.QueryParameterException: could not locate named parameter [username]

public UserInfo findUserInfo(String userName) { 
    String sql = "Select new " + UserInfo.class.getName() + "(u.username,u.password) "// 
      + " from " + User.class.getName() + " u where u.username=(:username)"; 

    Session session = sessionFactory.getCurrentSession(); 

    Query query = session.createQuery(sql).setParameter("username", userName); 

    return (UserInfo) query.uniqueResult(); 
} 

隨着的UserInfo是無實體:

public class UserInfo { 

    private String username; 
    private String password; 

    public UserInfo() { 
    } 

    public UserInfo(String username, String password) { 
     this.username = username; 
     this.password = password; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getUsername() { 
     return username; 
    } 

    public void setUsername(String username) { 
     this.username = username; 
    } 
} 

回答

0

假設你有一個名爲User的實體取代並刪除您的參數(:username)的括號;它應該是:username

所以你的字符串應該是象下面這樣:

String sql = "Select new " + UserInfo.class.getName() + "(u.username,u.password) " 
      + " from yourpackageHERE." + User.class.getName() + " u where u.username=:username"; 

但是如果你的實體被稱爲UserInfo然後確保在selectfrom都使用UserInfo

String sql = "Select new " + UserInfo.class.getName() + "(u.username,u.password) " 
       + " from yourpackageHERE." + UserInfo.class.getName() + " u where u.username=:username"; 
+0

感謝您的幫助。但是UserInfo是普通的類(非實體),User是映射到表用戶的實體。 –

+0

@GiangPhanThanhGiang然後從你的軟件包中使用'String sql =「Select new」+ UserInfo.class.getName()+「(u.username,u.password)」 +「。 + User.class.getName()+「u where u.username =:username」;' – Mitchapp

+0

感謝您的幫助。我發現我的問題。因爲我沒有用Hibernate來聲明我的實體。 –

0

下面是來自JPA 2.0 Specification的摘錄:

4.3.1 Naming

Entities are designated in query strings by their entity names. The entity name is defined by the name element of the Entity annotation (or the entity-name XML descriptor element), and defaults to the unqualified name of the entity class. Entity names are scoped within the persistence unit and must be unique within the persistence unit.

所以,根據上述規格的提取物,你的查詢字符串應該是:

String sql = "select new " + UserInfo.class.getName() + "(u.username, u.password) from User u where u.username=:username"; 

假設你已經定義了一個實體User,User.class.getName()返回該類的限定名稱(包括包名稱),而JPA要求該實體的名稱沒有限定。另一方面,正如用戶@Mitchapp指出的那樣,在指定參數周圍不允許使用括號。

+0

我刪除了在命名參數周圍的括號,但它也不起作用 –

+0

你會得到什麼?有什麼異常?我認爲你在混合東西。如果您使用JPA,則使用'EntityManager'而不是'Session'。上面的查詢不是HQL,而是JP QL,這意味着你最好使用EntityManagerFactory和EntityManager來定義你的查詢。 – ujulu

+0

感謝您的幫助。我發現我的問題,我的Entitiy不在工廠Bean掃描的包中。 –

相關問題