Hibernate Criteria Generico

5 respostas
R

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

5 Respostas

marciobarroso

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

R

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

plentz
Você está extendendo de um GenericDAO<T, ID extends Serializable>? Se sim, você pode fazer desta forma:
public abstract class GenericDAO&lt;T, ID extends Serializable&gt; {

    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;
    }
}

E seu uso ficaria super simples:

public class PessoaDao extends GenericDAO&lt;Pessoa, Long&gt;{

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

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

plentz

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.

public class PessoaDao extends GenericDAO&lt;Pessoa, Long&gt;{
 
 	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));
 	}
 }
Criado 14 de março de 2007
Ultima resposta 15 de mar. de 2007
Respostas 5
Participantes 3