消息:请记住,序数参数是基于1的! (而我)

时间:2011-09-20 01:51:14

标签: hibernate

我正在尝试为登录创建更通用的方法。

public boolean login(String login, String pass) 
             throws ClassNotFoundException, SQLException {   
        open();   
        q = s.createQuery("select u from Usuario u 
                               where u.login =:id1 and u.pass = :id2");   
        q.setString("id1", login);  
        q.setString("id2", pass);  
        if(q.uniqueResult()!=null)  
        return true;  
        else  
            return false;
}

我的代码运行得很好,但现在我想做类似的事情:

 public boolean login(String login, String pass) 
          throws ClassNotFoundException, SQLException {  

        return paramFunction("select u from Usuario u 
             where u.login = ?1 and u.pass=?2", login, pass);
 }
 public boolean paramFunction(String query, Object... params){
    try {
        open();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    q = s.createQuery(query);
            for (int i = 1; i <= params.length; i++) {
                q.setParameter(i, params[i-1]);}
    if (q.uniqueResult() != null)
        return true;
    else
        return false;

但现在我得到了:

  

java.lang.IndexOutOfBoundsException:记住序数参数   是基于1的!

虽然你可以看到我使用的是基于1的方法。我正在做什么出了什么问题?

谢谢你的帮助!

2 个答案:

答案 0 :(得分:3)

实际上,在Hibernate中参数是基于0的。请参阅docs

position - the position of the parameter in the query string, numbered from 0.

答案 1 :(得分:0)

当我使用不匹配的参数计数调用HibernateTemplate时,也会发生此错误。

String query = "select * from table where x=? and y=? and z=? order by timestamp desc";
HibernateTemplate ht = getHibernateTemplate();
ht.find(query, parm1, parm2, parm3, parm4); 

// i was calling find() with 4 parmeters while the query only expects 3 parameters -> IndexOutOfBoundsException