Criando DAO Generico, erro no metodo de listar [RESOLVIDO]

13 respostas
L

Olá Pessoal, boa noite. Já dei uma lida nos tópicos parecido com esse mas não achei uma solução ainda. Tenho um DAO generico, e gostaria de saber como fazer o metodo que lista todos os objetos de uma tabela:

public List <Object>  buscaObjeto(Object objeto){
        List <Object> listaObjetos = null;

        session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        try{
        listaObjetos =  session.createQuery("FROM " + objeto.getClass() +
                " objeto ").list();
        }catch(ConstraintViolationException erro){
            System.out.println("Erro: " + erro);
            JOptionPane.showMessageDialog(null, "Erro ao tentar recuperar", "Erro", JOptionPane.ERROR_MESSAGE);
            session.getTransaction().rollback();
        }
        session.getTransaction().commit();

        return listaObjetos;
    }

para executar:

Servico objServico = new Servico();
       ServicoDAO objServicoDAO = new ServicoDAO();
        List <bean.Servico> listaServicos;
        listaServicos = (List<Servico>) (Servico) objServicoDAO.buscaObjeto(objServico);

        for(int i = 0; i < listaServicos.size(); i ++){
            System.out.println("Nome do Servico: " + listaServicos.get(i).getNomeServico() +
                    "\nValor do Servico: " + listaServicos.get(i).getPrecoServico()+
                    "\nId do Servico: " + listaServicos.get(i).getIdServico() );
        }
Porém tenho o seguinte erro:
Exception in thread "main" org.hibernate.hql.ast.QuerySyntaxException: unexpected token: class near line 1, column 6 [FROM class bean.Servico objeto ]

Eu escrevi a consulta corretamente?

Obrigada, pessoal.

13 Respostas

A

Ola… vou postar aqui pra voce o codigo de uma DAO Generica que eu implementei… o metodo para listar os objetos ficou assim…

public List<Object> listAllGeneric(Object QueryObject) {

		List<Object> elementsResult = null;
		Transaction tx = null;
		//Session session = SessionFactoryUtil.getInstance().getCurrentSession();
		Session session = getSession();

		try {
			tx = session.beginTransaction();
			Query select = session.createQuery("select p from "+QueryObject.getClass().getName()+" as p");
			elementsResult = AmostechUtils.castList(QueryObject.getClass(), select.list());
			for (Iterator<Object> iter = elementsResult.iterator(); iter.hasNext();) {
				Object element = iter.next();
				logger.debug("{}", element);
			}

			tx.commit();
		} catch (RuntimeException e) {
			if (tx != null && tx.isActive()) {
				try {
					// Second try catch as the rollback could fail as well
					tx.rollback();
				} catch (HibernateException e1) {
					logger.debug("Error rolling back transaction");
				}
				// throw again the first exception
				throw e;
			}
		}
		return elementsResult;
	}

Qualquer duvida soh perguntar…

A

acredito que seja object.getClass().getName()
e nao apenas object.getClass() entende? Testa dessa maneira que eu flei pra vc… acho que vai funcionar…

L

OI! Obrigada pela reposta. Não sabia que dava pra fazer isso.

Mas agora estou com o seguinte erro:

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to bean.Servico at apolo.Main.main(Main.java:45) Java Result: 1

listaServicos = (List<Servico>) (Servico) objServicoDAO.buscaObjeto(objServico);

O que você acha

L

LarissaNepomuceno:
OI! Obrigada pela reposta. Não sabia que dava pra fazer isso.

Mas agora estou com o seguinte erro:

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to bean.Servico at apolo.Main.main(Main.java:45) Java Result: 1

listaServicos = (List<Servico>) (Servico) objServicoDAO.buscaObjeto(objServico);

O que você acha

“isso” é .getName()

A

Ola, tambem enfrentei este problema ao utilizar essa funcao… A maneira como voce esta tentando fazer o cast nao funciona.

Quando eu recebo a lista devolvida pelo metodo da DAO eu faco o cast da seguinte maneira…

public static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
		List<T> r = new ArrayList<T>(c.size());
		for (Object o : c)
			r.add(clazz.cast(o));
		return r;
	}

Depois no seu caso acho que a chamada ficaria da seguinte maneira…

listaServicos = castList(Servico.class, objServicoDAO.buscaObjeto(objServico));

Espero ter ajudado. abrass

D

Boa Tarde

Bem, sobre o cast da sua pesquisa, primeira coisa, que tipo de objeto o metodo devolve ? objServicoDAO.buscaObjeto(objServico)

P

Eu criei uma maneira bem elegante e dinamica para trabalhar com objetos genericos com um DAO generico, segue link http://www.guj.com.br/java/221618-filter-dinamico-para-hibernate ou [ur]http://felipepriuli.wordpress.com/2010/10/12/priuli-filter/[/url] pra quem quizer ver… abrçs

L

Olá amostech. Funcionou cara! Muito bom mesmo, mas eu não entendi direito como o castList funciona. Isso servirá para qualquer objeto em que eu requiera uma lista?
Fiquei empolgada agora. Muito bom mesmo!

Então, denisbenjamim, seguinte é um objeto Servico, mas tipo, ele não precisa saber disso, basta retorna a lista de objetos que eu enviar… :wink:
Priuli vou dar uma lida na solução :wink:
Valew pessoal.

L

VALEW GALERA

D

LarissaNepomuceno:
Olá amostech. Funcionou cara! Muito bom mesmo, mas eu não entendi direito como o castList funciona. Isso servirá para qualquer objeto em que eu requiera uma lista?
Fiquei empolgada agora. Muito bom mesmo!

Então, denisbenjamim, seguinte é um objeto Servico, mas tipo, ele não precisa saber disso, basta retorna a lista de objetos que eu enviar… :wink:
Priuli vou dar uma lida na solução :wink:
Valew pessoal.

Perguntei o tipo, por que no caso do DAO que uso, eu passei a ele uma Classe a qual ele deveria consultar, mas mesmo assim, ele sempre me devolve um List ou seja, devolve Dados do tipo Object, eu simplesmente quando repasso, para a aplicação em outro list, ou arraylist, ou eu especifico nesse novo list, o tipo utilizando <?> ou, quando for passar para a classe responsavel uso um Cast simples, do tipo minha_classe novaclasse = (novaclasse) MeuList.get(idx); .

A

Entao, o castList funciona assim ele cria uma nova lista auxiliar capaz de receber elementos do tipo do seu objeto, no caso Servico, dai ele vai adicionando a esta nova lista os elementos da lista que voce passou como parametro para a lista auxiliar fazendo o cast individual. Depois ele retorna a lista auxiliar…

Acredito que a solucao do priuli seja mais elegante sim. E inclusive quero dar uma olhada, porem agora estou com o prazo meio apertado para concluir o sistema e nao posso parar para resolver isso. Mas com certeza vou dar uma olhada!

um abraco.

L

Valew pessoal. Isso mesmo.

D

amostech:
Entao, o castList funciona assim ele cria uma nova lista auxiliar capaz de receber elementos do tipo do seu objeto, no caso Servico, dai ele vai adicionando a esta nova lista os elementos da lista que voce passou como parametro para a lista auxiliar fazendo o cast individual. Depois ele retorna a lista auxiliar…

Acredito que a solucao do priuli seja mais elegante sim. E inclusive quero dar uma olhada, porem agora estou com o prazo meio apertado para concluir o sistema e nao posso parar para resolver isso. Mas com certeza vou dar uma olhada!

um abraco.

Bom dia Galera, do guj… bom concordo que ficar fazendo o cast um por um é meio desnecessario, so passar as especificações da classe ao list<?> , ai nao será necessario fazer o cast da forma que eu havia citado , abraço galera.

Criado 3 de abril de 2011
Ultima resposta 23 de abr. de 2011
Respostas 13
Participantes 4