[RESOLVIDO] [HIBERNATE] Generic DAO

Boa tarde a todos.

Estou criando uma DAO genérico utilizando o Hibernate 4.1

Gostaria de saber como eu posso criar uma busca em cima de um Objeto, que eu chamei de findByExample (Não estou usando Spring).

[HibernateUtil]

public class HibernateUtil {
	private static SessionFactory sessionFactory;
	
	//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)
	public SessionFactory setUp(){
		return new Configuration().configure().buildSessionFactory();		
	}
	
	//Obtem a SessionFactory
	public SessionFactory getSessionFactory(){
		return this.sessionFactory = setUp();
	}
}

[AbstractDAO]

public abstract class AbstractDAO<T> {
	private Class classe;
	private Session session;
	
	public AbstractDAO(){
		this.classe = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		setSession(new HibernateUtil().getSessionFactory());
	}
	
	public void setSession(SessionFactory sf){
		this.session = sf.openSession();
	}
	
	public void save(T t){
		this.session.beginTransaction();
		this.session.save(t);
		this.session.close();
	}
	
	public void delete(T t){
		this.session.beginTransaction();
		this.session.delete(t);
		this.session.close();
	}
	
	public void alter(T t){
		this.session.beginTransaction();
		this.session.update(t);
		this.session.close();
	}
	
	public List<T> findAll(T t){
		this.session.beginTransaction();
		return this.session.createCriteria(this.classe).list();
	}
	

        //Como implementar esta busca?
	public List<T> findByExample(T t){
		this.session.beginTransaction();
		
	}
}

Agradeço as respostas.

private Class classe;

public List&lt;T&gt; findByExample() throws Exception {
        return session.createCriteria(classe).list();
}

[quote=romarcio][code]
private Class classe;

public List<T> findByExample() throws Exception {
return session.createCriteria(classe).list();
}
[/code][/quote]

Uma dúvida que gerou agora, se reparar no meu método findAll eu não implementei o this.session.close(). Isto pode gerar algum problema mais grave?

Obrigado pela resposta.

Primeiramente, você não precisa abrir uma transação em consultas. Em segundo lugar você só precisa de uma instância de sessionFactory.

public class HibernateUtil {
	private static final SessionFactory sessionFactory;
	
	//COnfigura um objeto do tipo SessionFactory que irá prover todos os objetos de Sessão (Session)
	static {
		this.sessionFactory = new Configuration().configure().buildSessionFactory();		
	}
	
	//Obtem a Session
	public static Session getSession(){
		return this.sessionFactory.openSession();
	}
}
public abstract class AbstractDAO<T> {
	private Class classe;
	private Session session;
	
	public AbstractDAO(){
		this.classe = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}
	
	protected Session getSession(){
		if(this.session == null || !this.session.isOpen()){
			this.session = HibernateUtil.getSession();
		}
		return this.session;
	}
	
	public void save(T t){
		getSession().beginTransaction();
		getSession().save(t);
		getSession().close();
	}
	
	public void delete(T t){
		getSession().beginTransaction();
		getSession().delete(t);
		getSession().close();
	}
	
	public void alter(T t){
		getSession().beginTransaction();
		getSession().update(t);
		getSession().close();
	}
	
	public List<T> findAll(T t){
		return getSession().createCriteria(this.classe).list();
	}
	
         /**
	 * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo
	 * com o exemplo passado.
	 *
	 * @param filtro
	 * @param matchMode
	 * @param ignoreCase
	 * @return lista
	 */
	public List<T> findByExample(T filtro, MatchMode matchMode, boolean ignoreCase){
		org.hibernate.criterion.Example example = org.hibernate.criterion.Example.create(filtro);

		if(matchMode != null){
			example = example.enableLike(matchMode);
		}

		if(ignoreCase){
			example = example.ignoreCase();
		}

		return getSession().createCriteria(this.classe).add(example).list();
	}
}

Entendi.

Agora uma dúvida aqui quanto ao Reflection.

Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.

Como reverter isto e pegar apenas a classe, sem seu caminho?

[quote=edu_fernandes]Entendi.

Agora uma dúvida aqui quanto ao Reflection.

Minha classe está em um pacote, quando eu pego ela no GenericDAO ele me traz o nome completo, incluindo o pacote onde ela está.

Como reverter isto e pegar apenas a classe, sem seu caminho?[/quote]

Como assim cara, não entendi o que você esta fazendo e pq? como assim pegando a classe no genericDao? Coloca o código ai…

Ao pegar o classe ele me traz o pacote junto.

Ex.:

package teste

public class MinhaClasse

No AbstractDAO, quando vou realizar uma busca, o SQL está dando erro pois ele está trazendo teste.MinhaClasse e atribuindo a minha Class classe

o método é Class.getSimpleName(). Cuidado com métodos de busca genérico, tenha em mente os limites que você quer, senão, você dará milhões de voltas, e não chegará onde se deseja =p

É exatamente isto.

Muito obrigado.