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
