簡體   English   中英

找不到命名參數休眠

[英]Could not locate named parameter Hibernate

這是我的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類。 用戶是休眠實體,用戶信息是我使用的模型。

@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;
   }

}

有什么幫助嗎?

看起來該屬性在您的POJO中名為UserInfo:userName,並且您正在嘗試使用用戶名

我的意思是您使用的是小寫的“ n”而不是大寫的“ N”

希望這對您有所幫助,查詢甚至接受位置參數:

也許您可以在查詢中嘗試u.username = ?1
query.setParameter(1, userName); 設定參數

無論如何,您可以將結果獲取到User對象並使用它,我認為您不需要UserInfo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM