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

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:

[code]public List buscaObjeto(Object objeto){
List 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;
}[/code]

para executar:

[code] Servico objServico = new Servico();
ServicoDAO objServicoDAO = new ServicoDAO();
List <bean.Servico> listaServicos;
listaServicos = (List) (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() );
    }

[/code]

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.

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…

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

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

[quote=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[/quote]

“isso” é .getName()

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

Boa Tarde

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

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

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.

VALEW GALERA

[quote=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.
[/quote]

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); .

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.

Valew pessoal. Isso mesmo.

[quote=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.[/quote]

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.