Hibernate Criteria Generico

Existe a possibilidade de fazer um tipo de criteria generico no hibernate.

VOu ter uma classe onde vai ter o metodo listByCriteria onde ele receberia um objeto criteria e o mesmo se encarregava de fazer a busca

metodo responsavel pela busca


public List listByCriteria (Class clazz, Criterion criterion){
		
		List list = null;
		
		try{
			HibernateUtility.beginTransaction();
		
			Criteria generiCriteria = HibernateUtility.currentSession().createCriteria(clazz);
			generiCriteria.add(criterion);
									
			list = generiCriteria.list() ;
			
			HibernateUtility.commitTransaction();
		
		}catch(HibernateException e){
			
			HibernateUtility.rollbackTransaction();
			
			System.err.println(e.toString());
			throw e;
		}finally{
			HibernateUtility.closeSession();
		}
		
		return  list;
	}

não estou achando solução para a classe q chamar este metodo

Vc pode fazer algo do tipo:

public List listByCriteria (Class clazz, Object object){
 		
 		try{
 			return HibernateUtility.currentSession().createCriteria(clazz).add(org.hibernate.criterion.Example.create(object)).list() ;
 		}catch(HibernateException e){
 			System.err.println(e.toString());
 			throw e;
 		}finally{
 			HibernateUtility.closeSession();
 		}
 		return  null;
 	}

Sendo q ao invés de ter o trabalho de montar o criterion, vc simplesmente passa seu entity. O Hibernate abstrai do desenvolvedor a necessidade de criar uma criterion com os atributos do objeto q estão preenchidos.

[]'s

Mas como vou implementar pois dependendo da situação vou querer usar Restrictions.like("","") em outros vou precisar usar o Restrisctions.eq("","")

Você está extendendo de um GenericDAO<T, ID extends Serializable>? Se sim, você pode fazer desta forma:

[code]public abstract class GenericDAO<T, ID extends Serializable> {

private Class&lt;T&gt; persistentClass;

//seus outros métodos genéricos

protected List&lt;T&gt; findByCriteria(Criterion... criterion) {
    Criteria crit = getSession().createCriteria(getPersistentClass());
    for (Criterion c : criterion) {
        crit.add(c);
    }
    return crit.list();

}

public GenericDAO() {
    this.persistentClass = (Class&lt;T&gt;) ((ParameterizedType) getClass()
                            .getGenericSuperclass()).getActualTypeArguments()[0];
 }

public Class&lt;T&gt; getPersistentClass() {
    return persistentClass;
}

}
[/code]

E seu uso ficaria super simples:

[code]public class PessoaDao extends GenericDAO<Pessoa, Long>{

public List&lt;Pessoa&gt; searchByName(String name) {
	return findByCriteria(Restrictions.like("name", name));
}

}[/code]

A minha duvida é o seguinte como q vou passar o parametro para o metodo findByCriteria sendo q este metodo é um array, ou seja, passar um array com os Restrictions.

Ex: no caso de um “and” posso querer consultar por mais de uma coluna.

Não estou sabendo como popular a a variavel q sera passada como parametro para o método findByCriteria

Tu não passa um array, só vai adicionando os parâmetros como se fossem parâmetros naturais do método. Isso é uma feature do java 5 chamada varargs. Você pode fazer como abaixo que irá funcionar da mesma forma.

[code]public class PessoaDao extends GenericDAO<Pessoa, Long>{

public List&lt;Pessoa&gt; searchByNameAgeSex(String name, Integer age, String sex) {
	return findByCriteria(Restrictions.like("name", name),
	 		 	      Restrictions.like("age", age),
	 		 	      Restrictions.like("sex", sex));
}

}[/code]