Método genérico em Hibernate gerando erro

8 respostas
furacao123

fiz um método pra ficar genérico em minha aplicação

protected <T extends Serializable> List<T> getPureList(Class<T> classToCast, String query, Object... parametros) { Session ses = getSession(); Query qr = ses.createQuery(query); for(int i = 1;i <= parametros.length; i++) { qr.setParameter(i, parametros[i-1]); } List<T> retorno = qr.list(); ses.getTransaction().commit(); ses.close(); return retorno; }

mas ao executar esse método

public List<EscolaTO> getEscolaByNome(int nome) {
       return getPureList(EscolaTO.class, "FROM EscolaTO esc WHERE esc.nome = ?1", nome);
   }

gera o seguinte erro

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based! at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterDescriptor(ParameterMetadata.java:79) at org.hibernate.engine.query.ParameterMetadata.getOrdinalParameterExpectedType(ParameterMetadata.java:85) at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:421) at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:393) at DAO.GenericDAO.getPureList(GenericDAO.java:81)

o que pode estar errado??

8 Respostas

Marky.Vasconcelos

Não sei o erro… mas voce não acha melhor usar o Criteria invés de usar Query?

protected <T extends Serializable> List<T> getPureList(Class<T> classToCast, Object[]... parametros) {
        Criteria crit = getSession().createCriteria(classToCast);
        for(Object[] param : parametros)
            crit.add(Restrictions.eq(param[0], param[1]);
        List<T> retorno = crit.list();
        getSession().close();
        return retorno;
    }
public List<EscolaTO> getEscolaByNome(int nome) {
       return getPureList(EscolaTO.class, new Object[][]{{"nome", nome}});
   }
furacao123

eu nunca usei o Criteria poderia me explica melhor a diferença?

e ao usar o metodo de exemplo me da um erro na linha

crit.add(Restrictions.eq(param[0], param[1]));

Eu mudei o parametro e ajustei o seu exemplo com o CreateQuery

protected &lt;T extends Serializable&gt; List&lt;T&gt; getPureList(Class&lt;T&gt; classToCast, String query, Object[]... parametros) {
        Session ses = getSession();
        Query qr = ses.createQuery(query);

        for(Object[] param : parametros) {
            qr.setString(param[0].toString(), param[1].toString());
        }

        List&lt;T&gt; retorno = qr.list();
        ses.getTransaction().commit();
        ses.close();
        return retorno;
    }

e chamo o método normal

public List&lt;EscolaTO&gt; getEscolaByNome(String nome) {
       return getPureList(EscolaTO.class, "FROM EscolaTO esc WHERE esc.nome = :nome", new Object[][]{{"nome", nome}});
   }
furacao123

dei uma pesquisada e o criteria serve pra fazer consulta OO vou dar uma olhada melhor mas parece ser melhor que o CreateQuery mesmo não preciso escrever Selects

quando ao erro na linha só estava faltando um toString()

é que o netBeans me confundio na hora de mostrar que estava errado :smiley:

mas agora porque nao funcionou o código anterior é outra duvida tambem

vlw

Marky.Vasconcelos

Cara… eu postei um doc que eu mesmo escrevi a um tempo atraz. Se eu achar eu e mostro o link. Da pra iniciar com Criteria.

furacao123

ta ok quando achar pode posta

Marky.Vasconcelos

Procurei… mas não achei.

Amanha no trampo eu faço o upload do arquivo denovo.

Marky.Vasconcelos

Ta ai…

Uma ve eu começei a escrever um tutorial sobre Hibernate…

Mas parei na metade, ainda assim da pra ter uma ideia da API.

o arquivo Hibernate Required é sobre os jars necessarios.
O hibernate 3 tutorial começa falando sobre como configurar, mas voce pode pular essa parte.

furacao123

vlw ja baixei vou dar uma lida depois…

estou pensando tambem em fazer um blog e ir postando tuto, dicas de hibernate :smiley:

Criado 18 de junho de 2009
Ultima resposta 21 de jun. de 2009
Respostas 8
Participantes 2