Listar Tudo Generico

10 respostas
jximenes

Ola Pessoal… estou com uma duvida para fazer um metodo que lista todos os elementos de uma tabela do meu banco, mas essa lista tem que ser generica para poder listar todas as minhas classes( no caso o meu metodo listaTudo())… eu estou usando o Hibernate… e tentei fazer isso aqui embaixo mas nao ta dando certo… se alguem puder dar uma luz eu agradeçooo…

obrigado!!

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

public class GenericoHibernateDao<T> implements Dao<T>  {
	
	private Session session;
	private Class classePersistente;
	private T t;
	
	public GenericoHibernateDao(Session session, T t){
		
		this.session = session;
		this.t = t;
		this.classePersistente = (Class) t;
		
	}

	@Override
	public void salva(T t) {

		this.session.beginTransaction();
		this.session.save(t);
		this.session.getTransaction().commit();
		
		
	}

	@Override
	public void remove(T t) {

		this.session.delete(t);
		
	}

	@Override
	public void atualiza(T t) {

		this.session.update(t);
	}
	@Override
	public List<T> listaTudo() {
		
		

		return session.createCriteria(classePersistente).list();
		
	}

}

Erro

Exception in thread "main" java.lang.ClassCastException: br.com.jp.hibernate.Produto cannot be cast to java.lang.Class
	at br.com.jp.hibernate.GenericoHibernateDao.<init>(GenericoHibernateDao.java:18)
	at br.com.jp.hibernate.TestaDaoGenerico.main(TestaDaoGenerico.java:16)

10 Respostas

E
this.classePersistente = (Class) t;

tenta trocar por:

this.classePersistente = t.class;
jximenes

quando eu faço isso o eclipse sugere que eu crie uma classe t ou uma interface t

A

Tenta:

this.classePersistente = t.getClass() ;
jximenes

Muito Obrigado amigo… deu certo com o getClass.

A

Uma dúvida sobre o seu código. Para que serve isso:

private T t;

Você não usa esse t em nenhum outro lugar da classe.
Para salvar, remover e atualizar você passa um novo t como parâmetro.
Para listar, não é necessário.

Você pode excluir esse atributo e alterar seu construtor para:

public GenericoHibernateDao(Session session, Class&lt;T&gt; clazz) {
    this.session = session;  
    this.classePersistente = clazz;
  }

Pode inclusive, declarar o atributo classePersistente com o tipo genérico:

private Class&lt;T&gt; classePersistente;

Enfim, são apenas algumas sugestões.

M

veja se isso ajuda

package br.com.projeto.dao;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.OrderBy;
import javax.persistence.criteria.Order;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;

import br.com.projeto.beans.ItensDeServico;
import br.com.projeto.beans.OrdemDeServico;
import br.com.projeto.util.HibernateUtil;

public class HibernateDao<T> implements InterfaceDao<T> {

	private Class<T> classe;
	
	public HibernateDao(Class<T> classe) {
		super();
		this.classe = classe;
	}	
	
	@Override
	public void salvar(T bean) {
		Session session = HibernateUtil.getSf().openSession();
		session.beginTransaction();
		session.save(bean);
		session.getTransaction().commit();
	}

	@Override
	public void deletar(T bean) {
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		session.delete(bean);
		session.getTransaction().commit();
	}

	@Override
	public void atualizar(T bean) {
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		session.update(bean);
		session.getTransaction().commit();		
	}

	@Override
	public List<T> getBeans() {
		Session session = HibernateUtil.getSf().openSession();
		session.beginTransaction();
		List<T> beans = (List<T>) session.createCriteria(classe).list();
		session.getTransaction().commit();
		return beans;
	}

	@Override
	public T getBean(Serializable id) {
		Session session = HibernateUtil.getSf().openSession();
		session.beginTransaction();
		T bean = (T) session.get(classe, id);
		session.getTransaction().commit();
		return bean;
	}
	
	public List<T> getBeansItens(Serializable id){
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		List<T> beans = (List<T>) session.createQuery("from ItensDeServico where id_ordemDeServico="+id).list();
		session.getTransaction().commit();
		return beans;
	}

	
	public void deletarVarios(List<ItensDeServico> itensDeServico){
		Session session = HibernateUtil.getSf().getCurrentSession();
		ItensDeServico iten = new ItensDeServico();
		for (int i = 0; i < itensDeServico.size(); ++i){
		iten = itensDeServico.get(i);
		session.beginTransaction();
		session.delete(iten);
		session.getTransaction().commit();
		}
	}
	
	
	public List<T> getBeansData(String data3, String data4){
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		List<T> beans = (List<T>) session.createQuery("FROM OrdemDeServico WHERE dataFechamento BETWEEN '"+data3+"' AND '"+data4+"'").list();
		session.getTransaction().commit();
		return beans;
	}
	
	public List<T> getBeansOrdem() {
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		Criteria criteria = session.createCriteria(classe);
		criteria.addOrder(org.hibernate.criterion.Order.desc("idOrdemDeServico"));
		List<T> beans = criteria.list();
		session.getTransaction().commit();
		return beans;
	}
	
	
	
	
	
}
jximenes
michelorth_92:
veja se isso ajuda
package br.com.projeto.dao;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.OrderBy;
import javax.persistence.criteria.Order;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;

import br.com.projeto.beans.ItensDeServico;
import br.com.projeto.beans.OrdemDeServico;
import br.com.projeto.util.HibernateUtil;

public class HibernateDao<T> implements InterfaceDao<T> {

	private Class<T> classe;
	
	public HibernateDao(Class<T> classe) {
		super();
		this.classe = classe;
	}	
	
	@Override
	public void salvar(T bean) {
		Session session = HibernateUtil.getSf().openSession();
		session.beginTransaction();
		session.save(bean);
		session.getTransaction().commit();
	}

	@Override
	public void deletar(T bean) {
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		session.delete(bean);
		session.getTransaction().commit();
	}

	@Override
	public void atualizar(T bean) {
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		session.update(bean);
		session.getTransaction().commit();		
	}

	@Override
	public List<T> getBeans() {
		Session session = HibernateUtil.getSf().openSession();
		session.beginTransaction();
		List<T> beans = (List<T>) session.createCriteria(classe).list();
		session.getTransaction().commit();
		return beans;
	}

	@Override
	public T getBean(Serializable id) {
		Session session = HibernateUtil.getSf().openSession();
		session.beginTransaction();
		T bean = (T) session.get(classe, id);
		session.getTransaction().commit();
		return bean;
	}
	
	public List<T> getBeansItens(Serializable id){
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		List<T> beans = (List<T>) session.createQuery("from ItensDeServico where id_ordemDeServico="+id).list();
		session.getTransaction().commit();
		return beans;
	}

	
	public void deletarVarios(List<ItensDeServico> itensDeServico){
		Session session = HibernateUtil.getSf().getCurrentSession();
		ItensDeServico iten = new ItensDeServico();
		for (int i = 0; i < itensDeServico.size(); ++i){
		iten = itensDeServico.get(i);
		session.beginTransaction();
		session.delete(iten);
		session.getTransaction().commit();
		}
	}
	
	
	public List<T> getBeansData(String data3, String data4){
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		List<T> beans = (List<T>) session.createQuery("FROM OrdemDeServico WHERE dataFechamento BETWEEN '"+data3+"' AND '"+data4+"'").list();
		session.getTransaction().commit();
		return beans;
	}
	
	public List<T> getBeansOrdem() {
		Session session = HibernateUtil.getSf().getCurrentSession();
		session.beginTransaction();
		Criteria criteria = session.createCriteria(classe);
		criteria.addOrder(org.hibernate.criterion.Order.desc("idOrdemDeServico"));
		List<T> beans = criteria.list();
		session.getTransaction().commit();
		return beans;
	}
	
	
	
	
	
}

Neste caso vc esta abrindo a session em cada metodo, mas e pra fechar a session... isso nao pode causar um problema depois?

jximenes

AbelBueno:
Uma dúvida sobre o seu código. Para que serve isso:

private T t;

Você não usa esse t em nenhum outro lugar da classe.
Para salvar, remover e atualizar você passa um novo t como parâmetro.
Para listar, não é necessário.

Você pode excluir esse atributo e alterar seu construtor para:

public GenericoHibernateDao(Session session, Class&lt;T&gt; clazz) {
    this.session = session;  
    this.classePersistente = clazz;
  }

Pode inclusive, declarar o atributo classePersistente com o tipo genérico:

private Class&lt;T&gt; classePersistente;

Enfim, são apenas algumas sugestões.

é realmente o meu “t” nao servia pra nada…hehehe… falha de iniciante…hauhauahu… sugestao aceita… ja ate alterei o meu codigo…abração… e muito obrigado pela ajuda

M

quando eu dou commit(); ele fecha a sesssão

jximenes

a ta entendi… eu nao sabia dessa … muito obrigado pelas dicas… ja to usando o seu post como ideia para criar os meus metodos…hehe

Criado 19 de dezembro de 2011
Ultima resposta 21 de dez. de 2011
Respostas 10
Participantes 4