quinta, 26 de fevereiro de 2009

JavaAdvancedQueryFilter

Escrito por: alberto

Continuando o último tópico, sobre melhorar na carreira, investi mais um pouco nos projetos open source. Eu e Vinicius criamos o projeto JavaAdvancedQueryFilter, cujo objetivo é facilitar a criação de queries dinâmicas. A idéia é que, de forma simples e única, possam ser criadas queries dinâmicas sem a necessidade daqueles ifs chatos que verificam se determinado critério é para ser utilizado ou não. Com o filtro criado, ele pode ser “parseado” para qualquer provider como: JDBC/SQL, Hibernate/Criteria, Hibernate/HQL, JPAQL e por aí vai.

Agora vamos ver um exemplo de como seria determinada query fazendo do jeito padrão e usando o QueryFilter.


private void testCreateSimpleFilterWithUserNameAndEmailAttributesOnlyIfTheyArentNullUsingTheCommonWay(
User user) {
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());

}

private void testCreateSimpleFilterWithUserNameAndEmailAttributesOnlyIfTheyArentNullUsingTheFilter(
User user) {
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());
}

Agora um exemplo mais bem elaborado, onde deve-se buscar por todos usuarios que tenham residências em determinados endereços.


private void testFindUserThatLiveInSomeOfThatAddressUsingTheCommonWay(
Address[] addresses) {
Criteria criteria = sessionSharedBetweenAllMethods.createCriteria(User.class);
if(addresses.length>0){//have to test if the array is not empty, if it is, you can not pass for "in" expression
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());
// TODO Auto-generated method stub

}
private void testFindUserThatLiveInSomeOfThatAddressUsingTheFilterWay(
Address[] addresses) {
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));
// TODO Auto-generated method stub

}

O projeto está hospedado no sourceforge e como foi útil para mim espero que seja para vocês também.

Nenhum Comentário para " JavaAdvancedQueryFilter "

Nenhum Comentário


Deixe seu Comentários

  (obrigatório)

  (obrigatório) - (não é publicado)



newsletter

cadastre seu e-mail!  

últimas do twitter

» siga a settech no twitter

swTV

 


Atuando no mercado desde 1999, a SetWeb conta com um time de profissionais que busca soluções adequadas e eficazes para a sua empresa. Aliando estratégia à tecnologia, a SetWeb possui como foco principal o resultado de ações implementadas para cada negócio.
Esse é o nosso compromisso e o nosso desafio.