JavaAdvancedQueryFilter

Então pessoal, participo de um projeto onde mantemos um gerenciador de conteudo, no decorrer do desenvolvimento sempre temos mudança nos critérios de pesquisa, e acabamos com aquele código com alguns ifs. Como consequência fiz umas classes utilitarias para montar os criterios de uma forma um pouco mais fácil. Como eu achei útil, dei uma alterada nesta parte do projeto e liberei como open source. Abaixo segue uns trechos de código usando o filtro. A outra idéia é tentar montar os objetos que servem de pesquisa de forma dinâmica deixando ainda mais flexivel as queries dinâmicas.

  • Aqui fazemos uma pesquisa pelos usuarios que moram em determinado endereço
//forma que eu fazia
		Criteria criteria = sessionSharedBetweenAllMethods.createCriteria(User.class);
		if(addresses.length>0){//aqui tem que testar se tem enderecos, pq nao pode adicionar vazio no criteria
			Collection<String> descriptions = new ArrayList<String>();
			for (Address address : addresses) {
				descriptions.add(address.getDescription());
			}
			criteria.createAlias("addresses", "address").add(
					Restrictions.in("address.description", descriptions));
		}
		
		System.out.println(criteria.list());

//usando o filtro e um metodo utilitario para extrair os objetos em algum getter ou outro metodo da classe
		Criteria criteria = sessionSharedBetweenAllMethods.createCriteria(User.class);
		Filter filter = new Filter().addAlias("addresses", "address").add(new Condition("address.description", CollectionHelper.extractTheObjectsBasedInGetterAttributeOrOtherMethod("description",addresses), Operation.IN,new NotAcceptEmptyCollectionOrArrayClosure()));
		System.out.println(filter.apply(criteria));
            

//mais simples, apenas testando se os atributos não são nulos para entrar na query

//forma que eu fazia
		Criteria criteria = sessionSharedBetweenAllMethods
				.createCriteria(User.class);
		if (user.getName() != null) {
			criteria.add(Restrictions.eq("name", user.getName()));
		}
		if (user.getEmail() != null) {
			criteria.add(Restrictions.eq("email", user.getEmail()));
		}
		System.out.println(criteria.list());

// com o filtro
		Criteria criteria = sessionSharedBetweenAllMethods
				.createCriteria(User.class);
		Filter filter = new Filter();
		filter.add(new Condition("name", user.getName(), Operation.EQUALS,new NotAcceptNullValueClosure())).add(new Condition("email", user.getEmail(), Operation.EQUALS,new NotAcceptNullValueClosure()));
		System.out.println(filter.apply(criteria).list());

A idéia é que vc possa usar o mesmo filtro para diferentes providers, atualmente rola com o criteria, mas pode rolar para hql,sql,jpaql…
O link para download é http://sourceforge.net/projects/queryfilter/

Espero que ajude!!! :slight_smile: Queria ainda escrever de forma mais fácil, principalmente quando temos aliases e tal, idéis são muito bem vindas!!!

Alberto