EasyCriteria evoluiu para uaiCriteria. Novo nome e novas funcionalidades

Olá, tudo bem?

É com muita felicidade que venho anunciar o uaiCriteria, a evolução do EasyCriteria.

Por que a mudança de nome? Descobri que já existia no mercado um framework com o mesmo nome e para evitar qualquer problema eu resolvi mudar o nome do framework. A diferença é que o uaiCriteria trabalha com String como parâmetro, e o outro framework trabalha com MetaModel diretamente.

Para esclarecer algumas dúvidas sobre a mudança:

  • Seu código antigo continuará funcionando sem problema algum, o código é retro compatível

  • As classes EasyCriteira estão marcadas com @Deprecated e serão removidas na próxima versão

  • As novas classes tem os mesmo métodos que as antigas e muitas outras novidades. Basta fazer um “replace” de EasyCriteria por UaiCriteria e todo problema estará resolvido

  • Novamente, eu não queria mudar o nome mas também não quero problemas com outras pessoas

O framework também ganhou um mascote, eu espero que vocês gostem:

mascote

mascote

De novidades temos muitas, mas muitas mesmo! Vamos ver primeiro mudanças de estrutura:

  1. O site mudou, agora o site é o: http://uaicriteria.com

  2. O repositório mudou, agora estamos hospedados no GIT. Após diversos pedidos movi para o GIT para melhorar a visualização do código: https://github.com/uaihebert/uaicriteria

  3. Para ajudar na cobertura do código e análise estática foi adicionado o plugin do SONAR. A imagem de cobertura agora ficou até mais bonita:

    uaicriteria cobertura

    uaicriteria cobertura

  4. O site antigo será desativado e todos os dados antigos foram levados para site novo, até mesmo a documentação legada. [=

  5. A API atual existe limitações, algo como não possibilitar o uso do HAVING e algumas outras funções, desse modo será criada para próxima versão uma Interface/API para Criterias Complexas – aceito sugestão de nome para a Interface (:

Com relação ao código, temos diversas novidades:

Boas vindas ao Batoo

O Batoo é um provedor de JPA assim como EclipseLink ou Hibernate. Com essa nova versão diversas funcionalidades foram cobertas com o Batoo.

Note que eu disse diversas, mas não todas. Infelizmente o Batoo ainda tem muitos, mas muitos problemas mesmo com consultas e Criterias.

O uaiCriteria ainda dá cobertura aos frameworks Hibernate, EclipseLink e OpenJPA na maioria dos métodos.

MultiSelect

É possível escolher quais campos serão retornados em uma consulta, veja a JPQL:

select 
    p.name, 
    p.age

from Person p

Transformando a consulta acima em criteria:

final UaiCriteria<Person> uaicriteria = 
    UaiCriteriaFactory.UaiCriteriaFactory.createMultiSelectCriteria(entityManager, Person.class);

uaiCriteria.addMultiSelectAttribute("name")
           .addMultiSelectAttribute("age");

final List multiselectList = uaiCriteria.getMultiSelectResult();

Algumas considerações sobre o código acima:

  • O resultado terá um Object caso você retorne apenas um campo

  • O resultado terá um Object[] caso você retorne diversos campos

  • A implementação pode variar de Object[] ou Vector (pelo menos comigo o EclipseLink estava retornando Vector)

SubQuery

Agora é possível fazer subQuery. Imagine uma JPQL como a abaixo:

select p from Person p 
where p.id in 
        (select dog.person.id from Dog dog where dog.cute = true)

Nem vou citar quantas linhas de código seriam necessárias para fazer o código acima, mas com o UaiCriteria ficou bem mais fácil:

final UaiCriteria<Person> uaiCriteria = UaiCriteriaFactory.createQueryCriteria(Person.class);

final UaiCriteria<Dog> subQuery = uaiCriteria.subQuery("person.id", Dog.class); // dog.person.id

subQuery.andEquals("cute", true);

uaiCriteria.andAttributeIn("id", subQuery); //person.id

Basta criar um objeto de subQuery passando qual será o retorno da subQuery. Depois chame o método o attributeIn(…) da query principal passando qual o campo a ser comparado.

MapIsEmpty [NOT]

Agora é possível utilizar a função isEmpty com Map:

uaiCriteria.andCollectionIsEmpty("ENTITY_MAP");

AttributeIn [NOT]

Existe a opção de verificar se um valor está ou não dentro de uma lista. Veja o exemplo abaixo:

select p
from Payment p
where
    p.statusEnum in :enumList

Para transformar o código acima em criteria:

final UaiCriteria<Payment> uaiCriteria = 
    UaiCriteriaFactory.createQueryCriteria(Payment.class);

uaiCriteria.andAttributeIn("statusEnum", 
                           Arrays.asList(StatusEnum.VALUE_01, StatusEnum.VALUE_02));

O atributo não precisa ser necessariamente um enum, poder ser número, string, etc.

MemberOf [NOT]

A consulta abaixo

select d
from Departament d
where :person member of d.employeeList

Pode ser criada como:

final UaiCriteria<Departament> uaiCriteria = UaiCriteriaFactory.createQueryCriteria(Departament.class);

uaiCriteria.andIsMemberOf(person, "employeeList");

Count e CountRegularCriteria

Agora como é possível realizar uma consulta MultiSelect o método count() foi renomeado como countRegularCriteria(). Funciona do mesmo modo, houve apenas uma alteração no nome para ficar mais claro seu funcionamento.

CountAttribute

Existe situações onde é necessário realizar o count em cima de um atributo, algo como:

select count(p.id)
from Person p

E para executar como Criteria:

final UaiCriteria<Person> uaiCriteria = 
    UaiCriteriaFactory.createMultiSelectCriteria(Person.class);

uaiCriteria.countAttribute("id");

final List result = uaiCriteria.getMultiSelectResult();

GroupBy e funções de Agregação

Agora é possível realizar groupBy juntamente com diversas funções de agregação. Funções como sum, diff, divide, module, etc.

select sum(p.value), p.status
from Payment p
group by p.status

Poderia se executada como:

final UaiCriteria<Payment> uaiCriteria = 
    UaiCriteriaFactory.createMultiSelectCriteria(Payment.class);

uaiCriteria.sum("id").groupBy("status");

final List result = uaiCriteria.getMultiSelectResult();

Novo Import no Maven

Para utilizar a nova versão em seu projeto, basta adicionar o código abaixo ao seu pom.xml

<dependency>
    <groupId>uaihebert.com</groupId>
    <artifactId>uaiCriteria</artifactId>
    <version>4.0.0</version>
</dependency>

Bem, espero que você tenha gostado das novidades.

Não esqueça de visitar o site —————-> http://uaicriteria.com

Qualquer dúvida/crítica/sugestão basta falar.

Até mais. o_

6 thoughts on “EasyCriteria evoluiu para uaiCriteria. Novo nome e novas funcionalidades

  1. Ola Herbert, Parabéns manu, muito bom, seu framework é muito bom, ficou muito facil desenvolver consultas, o lance do multiSelect também achei bala eu mesmo utilizo muito com criteria do JPA, mas meta-model poderia ter né manu? :) com meta model fica muito facil a alteração pois ele ja te aponta todos locais que é utilizado diferente da String que tem que sair catando rsrsrsrsr. A outra grande sacada foi ter levado ele para o GIT :) quanto a troca de nome achei que foi nobreza de sua parte, mas ficou legal, acho até mais elegante hehehehe, chegou a conferir a data de publicação do EasyCriteria? abração manu, sucesso sempre ;)

    • Olá Dilnei, boa tarde.

      Na API atual eu não tenho como dar suporte ao MetaModel. Eu tentei mas não consegui.

      Na próxima versão eu estou pretendendo criar uma API para consultas complexas, seria algo como:

      select(“nome”, “idade”).where(equals(“sexo”, “M”))

      Com esse tipo de API eu conseguiria aplicar o MetaModel como evolução. [=

      Quanto ao outro framework eu olhei a data de crianção sim, por isso achei melhor trocar o nome. [=

      Obrigado pelo apoio e pela confiança. [=

  2. Olá Hebert!

    Cara, ainda sou novato com ORM, mas tive a felicidade de fazer um trabalho recente usando o Easy-criteria com Vraptor 3 e Hibernate e foi sensacional.

    Atualmente estou fazendo um novo projeto particular pra testar e aprender o Vraptor 4 com CDI + Hibernate, e com certeza vou usar o uaiCriteria 4.

    Minha dúvida é a seguinte, no projeto com Vraptor3 que mencionei eu usei o Entity Manager do próprio Vraptor e tudo funfou na boa!

    Agora, ao invés do EntityManager estou usando o Session do hibernate.

    Pode me dar uma luz se é possível e caso sim, como fazer uma consulta dessa por exemplo com o uaiCriteria ?
    Meu modelo chama itemFatura


    public double valorTotalItens(long id){

    String sql = "Select sum(valor) as total FROM item_fatura where fatura_id = :id";
    Query query = (Query) session.createSQLQuery(sql);
    query.setParameter("id", id);

    return (double) query.uniqueResult();

    }

    Aproveito para perguntar, é melhor usar o EntityManager ou o Session?

    Parabéns pelo trabalho e obrigado!

    • Ailton, boa tarde.

      Eu sei que o VRaptor dá várias formulas de bolo pronta, então não sei qual o impacto da alteração do Session para EntityManager.

      uaiCriteria usa apenas EntityManager, não tem como usar um session dentro dele.

      Qual usar vai do que você quer do hibernate. Se você quer utilizar coisas específicas do hibernate, fora do jpa, use o session. Se você quer usar coisas só do JPA, use o EntityManager. (:

      Obrigado pela visita e pela confiança.

  3. Hebert, estou testando seu framework em um projeto e tenho apenas duas palavras para descrever: Do caramba!!

    Está de parabéns!

    Quando chegar na parte dos testes vou testar o mock e dou o feedback também.

    Jesus abençoe!

    • Rafael, boa tarde.

      Me desculpe a demora, estive muito ocupado nesse último mês.

      Fico muito feliz em saber que você gostou da ferramenta.

      Obrigado pelo feedback e desculpe a demora.

Leave a Comment