2016-12-03 132 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扫描的包中。 –