2017-06-19 91 views
0

这是我的DAO方法中,我试图从数据库中获取用户详细信息:无法找到名为参数休眠

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); 
    query.setParameter("username", userName); 

    return (UserInfo) query.uniqueResult(); 
} 

,当我尝试执行它,我得到这个错误:

Caused by: org.hibernate.QueryParameterException: could not locate named parameter [username] 
    at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:148) 
    at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterExpectedType(ParameterMetadata.java:165) 
    at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:523) 
    at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:493) 
    at org.spajic.stefan.springhibernatesecurity.dao.UserInfoDAO.findUserInfo(UserInfoDAO.java:33) 
    at org.spajic.stefan.springhibernatesecurity.dao.UserInfoDAO$$FastClassBySpringCGLIB$$c14aad39.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
    at org.spajic.stefan.springhibernatesecurity.dao.UserInfoDAO$$EnhancerBySpringCGLIB$$3fdca957.findUserInfo(<generated>) 
    at org.spajic.stefan.springhibernatesecurity.authentication.MyUserDetailsService.loadUserByUsername(MyUserDetailsService.java:25) 
    at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:114) 
    ... 36 more 

这里还有User类和UserInfo类。用户是hibernate实体,UserInfo是我使用的模型。

@Entity 
@Table(name = "Users") 
public class User { 

    private String username; 
    private String password; 
    private boolean enabled; 

    @Id 
    @Column(name = "username", length = 36, nullable = false) 
    public String getUsername() { 
     return username; 
    } 

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

    @Column(name = "password", nullable = false) 
    public String getPassword() { 
     return password; 
    } 

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

    @Column(name = "enabled", nullable = false) 
    public boolean isEnabled() { 
     return enabled; 
    } 

    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 

} 

public class UserInfo { 

    private String userName; 
    private String password; 

    public UserInfo() { 

    } 

    // Do not change this constructor, it used in hibernate Query. 
    public UserInfo(String userName, String password) { 
     this.userName = userName; 
     this.password = password; 
    } 

    public String getUserName() { 
     return userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public String getPassword() { 
     return password; 
    } 

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

} 

任何帮助?

+0

你能告诉我映射和表结构 –

+0

你可以与我们分享你的用户和UserInfo模型吗? – DMC19

+0

我加入他们的问题 –

回答

2

貌似属性命名的UserInfo:用户名在你的POJO和你要使用的用户名

我的意思是你用的是小“N”,而不是一个帽“N”

+0

在我的UserInfo类,我改变用户名的用户名无处不在,它仍然抛出同样的错误 –

+1

您正在尝试混合User和UserInfo。虽然您已使用@Entity注释标记类“User”,但类“UserInfo”未标记任何此类注释。我认为这就是为什么春季在包扫描过程中没有检测到这个类,并且你得到这个错误 –

+0

任何建议如何注释UserInfo类? –

0

希望这帮助,查询甚至接受位置参数:

也许你可以尝试u.username = ?1查询
query.setParameter(1, userName);设置参数

反正你可以得到结果到用户对象和使用,我认为你不需要用户信息