Erro no Hibernate

4 respostas
A

Bom...estou com o seguinte problema no hibernate pois minha aplicação apresenta o seguinte erro:

java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!

Meu código está assim:

public Usuario getUsuarioParams(String nome, int codigo){
        return (Usuario) getPojoParams("from Usuario usr where usr.idUsuario = ?1 and usr.nome = ?2", codigo,nome);
    }
public Serializable getPojoParams(String query, Object... params){
        Session ses = getSession();
        Query qr = ses.createQuery(query);
        
        for(int i = 1; i <= params.length; i++){
            qr.setParameter(i, params[i - 1]);
        }
        Object toReturn = qr.uniqueResult();
        
        ses.getTransaction().commit();
        ses.close();
        return (Serializable) toReturn;
    }

Desde já agradeço a atenção.

4 Respostas

gregorioenrico

Adonias, vc verificou o tamanho dos parâmetros? Talvez tenha mais parâmetros que o esperado, aí vai quebrar dentro do “for”. Se tiver ao menos um parâmetro a mais, “qr.setParameter(i, params[i - 1]);” vai tentar setar um valor para i = 3, que não tem na sua query.

Dá uma olhada nestes parâmetros aí.

A

Companheiro verifiquei os paramêtros e eles estão corretos, o metódo tá recebendo dois parametros que são o idUsuario e o nome, enquanto que o params.length está retornando 2 o que de fato impossibilita o for de quebrar em um valor acima da quantidade de parametros passados, este problema é muito estranho pois aparentemente está tudo certo.

Um detalhe interessante é que quando utilizo a consulta com um parametro apenas modificando a representação dele em SQL de ?1 para somente ? ele funciona entretanto quando adciono um segundo parametro como ?1, ele já apresenta erro, conforme mostrado no codigo abaixo onde quando executo funciona normal.

public Usuario getUsuarioParams(int codigo){
        return (Usuario) getPojoParams("from Usuario usr where usr.idUsuario = ?", codigo);
    }
public Serializable getPojoParams(String query, Object... params){
        Session ses = getSession();
        Query qr = ses.createQuery(query);

        for(int i = 1; i <= params.length; i++){
            qr.setParameter(i - 1, params[i - 1]);
        }
        Object toReturn = qr.uniqueResult();
        
        ses.getTransaction().commit();
        ses.close();
        return (Serializable) toReturn;
    }

Esse código funciona normal, porém esse logo abaixo não ele dá o erro que reportei acima:

public Usuario getUsuarioParams(int codigo){
        return (Usuario) getPojoParams("from Usuario usr where usr.idUsuario = ?1", codigo);
    }
public Serializable getPojoParams(String query, Object... params){
        Session ses = getSession();
        Query qr = ses.createQuery(query);

        for(int i = 1; i <= params.length; i++){
            qr.setParameter(i, params[i - 1]);
        }
        Object toReturn = qr.uniqueResult();
        
        ses.getTransaction().commit();
        ses.close();
        return (Serializable) toReturn;
    }
gregorioenrico

Fala!

Cara, segundo a documentação do Hibernate (o link segue no final), o setParameter começa do zero. Então, tenta usar só ‘?’, sem os números, e fazer o for assim, da forma que vc já tinha tentado:

for(int i = 1; i <= params.length; i++){ qr.setParameter(i - 1, params[i - 1]); }

https://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html#setParameter(int,%20java.lang.Object)

Value!

A

Companheiro obrigado, realmente funcionou na verdade esse negócio de ?1, ?2 não existe basta apenas o ? que o hibernate através do setParameter onde determina-se a posição do parametro ele associa a string sql, blz! Nesse caso o código fica assim:

public Usuario getUsuarioParams(String nome, int codigo){
        return (Usuario) getPojoParams("from Usuario usr where usr.idUsuario = ? and usr.nome = ?", codigo,nome);
    }
public Serializable getPojoParams(String query, Object... params){
        Session ses = getSession();
        Query qr = ses.createQuery(query);

        for(int i = 1; i <= params.length; i++){
            qr.setParameter(i - 1, params[i - 1]);
        }
        Object toReturn = qr.uniqueResult();
        
        ses.getTransaction().commit();
        ses.close();
        return (Serializable) toReturn;
    }

valew!

Criado 26 de maio de 2009
Ultima resposta 26 de mai. de 2009
Respostas 4
Participantes 2