Apresentarei algumas funcionalidades do projeto JPriuli-Filter.

Tentarei ser breve neste post, por isso apresentarei as funcionalidades de uma forma bem resumida, porem com tudo que é necessário para usufruir deste pequeno projeto. Vamos lá!!

O funcionamento do Filter é simples, desde que entenda os itens abaixo:

•1ª- Todos os valores adicionados no filter são utilizados na construção da query
•2ª- Todas os critérios disponíveis para filtrar as consultas, ou seja as classes do projeto, estão no pacote net.priuli.filter.criterion e implementam a interface Criterion.
•3ª- Os valores adicionados no Filter são interpretados pelo FrameWork ORM e podem ocorrer erros. (Este erro é o erro do framework ORM).

# FactoryFilter.java

FactoryFilter.class – A fabrica ‘FactoryFilter’ é utilizada para instanciar um Filter. Podemos fazer da seguinte maneira:

Filter filter = FactoryFilter.createFilter()

# Filter.java

A implementação de um Filter armazena os critérios que serão usados para restringir uma consulta HQL. Abaixo apresentarei os métodos desta interface.

setDistinct(boolean)

Este método permite adicionar o comando distinct no select.

setRange(Range)

Este método permite restringir por quantidade ou paginar os resultados. Cada consulta utilizando um Range, terá uma nova pagina de resultados de acordo com a implementação do mesmo.
O projeto fornece duas classe, são elas: net.priuli.filter.criterion.RangeLimitImpl – Utilizado para paginação de resultados. Cada consulta usando este Range terá uma consulta de acordo com a pagina atual da paginação.
net.priuli.filter.criterion.RangeSimpleImp – Utilizado apenas para limitar uma quantidade de registros.

add(String, Object)

O método ADD é utilizado para adicionar os critérios no Filter.
O primeiro parâmetro é o nome do atributo ou relacionamento da entidade, já o segundo parâmetro é o valor que será utilizado na construção da query.

setCountOnly(boolean)

Este método permite realizar a contagem ao invés de retornar os dados. Vejamos:

Filter filter = FactoryFilter.createFilter();
filter.add("name","JOHN",LikeMode.ANYWHERE);
filter.setCountOnly(true);

//DAO 
Criteria criteria =  new CriteriaSelectBuilder<T>(session,persistentClass).build(filter);
			
Long qtd = (Long)criteria.uniqueResult()

#Critérios

As condições do SQL são representadas por classes que implementam a interface Criterion.

AND

Para adicionarmos o critério And, no filter, basta adicionar o nome do campo e o valor que o campo deve ter.

Filter filter = FactoryFilter.createFilter();
filter.add("id",  1L);

OR

A condição OR restringe por um ou outro valor.

	Filter filter = FactoryFilter.createFilter();
	filter.add("number", new Or(20L, 22L));

NOT EQUALS

A condição NotEquals é usada da seguinte maneira.

Filter filter = FactoryFilter.createFilter();
filter.add("name",  new NotEqual("Wil Wheaton"))

LIKE

O comando Like do SQL pode ser usado, adicionando a classe Like no método add() do filter.

filter.add("name",new Like("JOHN",LikeMode.START));

O LikeMode é um Enum e tem os seguintes valores: LikeMode.START; LikeMode.END; LikeMode.ANYWHERE;


IN

Os valores de tipo Collection são utilizadas como IN pelo filter. De qualquer modo o projeto oferece a classe net.priuli.filter.criterion.In

List numbers = new ArrayList();
numbers.add(65865422L);
numbers.add(89548345L);

Filter filter = FactoryFilter.createFilter();
filter.add("number", numbers);

NOT IN

A condição Not In pode ser obtida através da classe net.priuli.filter.NotIn.

	NotIn<Long> numbers = new NotIn<Long>();
	numbers.add(65865422L);
	numbers.add(89548345L);
		
	Filter filter = FactoryFilter.createFilter();
	filter.add("phones.number", numbers);
	

JOIN

A realização de Join é a novidade das atualizações acima da versão 2.0.
O join pode ser feito pela interface Filter, desde que exista as anotações de relacionamento nas entidades.

Filter filter = FactoryFilter.createFilter();	 
filter.add("phones.number", new Or(5683543L,89548345L));

personDAO.find(filter);

No exemplo, usamos um join (‘phones.number’) onde a entidade Person, da personDAO, terá um join com a entidade Phone (phones.xx). Para baixar exemplos, clique AQUI

BETWEEN

A classe Between restringe o resultado para que esteja entre dois valores.

Between between = new Between<Long>(5683543L, 89548345L)

Filter filter = FactoryFilter.createFilter("number", between );

LIMITER

A classe Limiter permite limitar o resultado através de um campo individualmente.

Limiter<Date> limiter = new Limiter<Date>(  date, LimiterMode.LESS_THAN_OR_EQUAL);

filter.add("birthday", limiter);

As possíveis constantes aceitas do Limiter são: LimiterMode.GREATER_THAN; LimiterMode.GREATER_THAN_OR_EQUAL; LimiterMode.LESS_THAN; LimiterMode.LESS_THAN_OR_EQUAL

FETCH

O fetch, muitas vezes, é necessário para evitar o Lazy Loader. Podemos usa-lo da seguinte maneira:

Filter filter = FactoryFilter.createFilter();
filter.add("phones", new Fetch(JoinMode.LEFT));

ORDER

Para ordenarmos o resultado, usamos a classe Order.

filter.add(new Order("name",OrderMode.ASC));

O orderMode define o tipo da ordenação podendo ser: OrderMode.ASC ou OrderMode.DESC

# CriterionFactory.java

É possível diminuir o acoplamento usando a classe net.priuli.filter.utils.CriterionFactory. Esta classe cria as implementações como veremos a seguir:

filter.add("number", CriterionFactory.between(5683543L, 89548345L));

O código fica mais enxuto em comparação com o que foi apresentado acima.
+ exemplos:

filter.add("number", CriterionFactory.notIn(new Long[]{1,5,6,3}));

Todas as funcionalidades aqui descritas estão disponíveis na versão 2.1+