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);
}
[code]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;
}[/code]
Desde já agradeço a atenção.
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í.
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);
}
[code]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;
}[/code]
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);
}
[code]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;
}[/code]
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!
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);
}
[code]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;
}[/code]
valew!