Criteria Hibernate parte II

opa! Pessoal,

Neste post veremos mais algumas restrições importantes que temos na API Criteria. Não deixarei de apresentar os codes, mais ainda não faremos nada pratico com o BD, reservei este momento para um outro post, onde vamos “respirar” toda série de modo mais prático em um único post, e focar mais no entendimento e uso do Criteria. Principalmente se você está começando agora nada melhor que ir passo-passo.

Lets go…

note: Uma coisa é certa: Quer aprender e melhorar seus conhecimentos? use a documentação, ela é tão explicativa quanto um tutorial passo-passo, uma das melhores documentações que já li, e o segredo não é decorar e sim ir implementado com base nas necessidade, crie situações (caso não tenha) e vá implementado aos poucos, quando menos esperar já vai está dominando as principais. Essa é minha dica. 🙂

Restrições com Criteria API

Uma outra restrição bem legal é o uso do >=, >, <=,< que fazemos no SQL,HQL etc. No Criteria temos métodos que nos ajudam na implementação desses operadores: gt(),ge(),lt(),le().

  • gt() = maior que

  • ge() = maior ou igual que

  • lt() = menor que

  • le() = menor ou igual que

Saber de onde os métodos pertencem é tão importante quando saber usá-los. Os citados acima vem da classe Resctrictions. Exemplo:

crit.add(Restrictions.ge(“preco”, new Double(100.00));

A leitura é bem simples: retorna todos os produtos com o preço maior ou igual 100.00. um dos pontos importante no uso de Criteria é quando precisamos usar AND e OR nas restrições.

crit.add(Restrictions.gt(“preco” new Double(100.0));

crit.add(Restrictions.like(“nome”, “smart%”));

List lista = crit.list();

A leitura é a seguinte: retorne produtos com o preco maior que 100.0 e (AND) que tenha o nome “smart” como parte da String.

Agora se precisarmos do OR, veja como fica:

Criterion preco = Restrictions.gt(“preco”, new Double(100.0));

Criterion nome = Resctrictions.like(“nome”, “smart%”);

LogicalExpression orExp = Resctrictions.or(preco,nome);

crit.add(orExp);

List list = crit.list();

A lógica é a seguinte: retorne produtos com preco maior que 100.0 ou que tenha “smart” na palavra. Na linha 4 adicionamos o resultado. Então a linha 2 somente é executada caso a primeira seja falsa.

Quando queremos mais que duas diferentes sequencias de OR poderíamos usar a classe Disjunction que fica em org.hibernate.Disjunction para representar uma disjunction. Sem sombras de duvidas usar disjunction é mais conveniente que vários OR no código, veja como fica:

Criterion preco = Resctrictions.gt(“preco”, new Double(100.0));

Criterion nome = Resctrictions.like(“nome”, “smart%”);

Criterion fornecedor = Restrictions.like(“fornecedor”, “nokia%”);

Disjunction dis = Resctrictions.disjunction();

dis.add(preco);

dis.add(nome);

dis.add(fornecedor);

cri.add(dis)

List lista = crit.list();

A leitura do código acima seria:

Retorne os produtos que tenha o preço maior que 100.0 ou (or) que tenha na parte da string a palavra “smart” ou que tenha na propriedade fornecedor a palavra “nokia”. Para fazer com o AND usamos o método conjunction() da classe Resctrictions.

Conjunction conj = Restrictions.conjuction();

Apenas alteramos de disjunction  para  a linha acima e assim temos a  clausula AND.

Vou ficando por aqui e espero que tenham gostado do post que foi simples e rápido.

See you next post, guys!!

abracos,

Criteria Hibernate na Prática

olá Pessoal,

Se você está iniciando com Hibernate um dia vai ser apresentado ao Criteria. Realmente quem usa Criteria não quer voltar ao SQL para as funções mais básicas, e sim para os casos extremos onde o Criteria não atende a um requisito que só temos no SQL. Então neste post, vou mostrar um pouco o que se pode fazer com o Criteria nas suas aplicações Java. Farei uma breve introdução ao Criteria neste primeiro post, no próximo, vamos colocar mão na massa de fato. Mas, por enquanto quero que conheçam um pouco a sintaxe.

Lets go…

Criteria

Criteria Query API permite construir query expression em Java permitindo assim a checagem em tempo de compilação, ao contrário do HQL ou SQL que não permite. Criteria API permite de forma programática construir objetos query a partir da interface org.hibernate.Criteria. Esta interface define os métodos disponíveis que precisamos trabalhar com Criteria.

Para persistir um objeto da classe, usamos o método createCriteria() que retorna um objeto Criteria que permite ter acesso a instância de persistência da classe. O createCriteria() pertence a interface Session. Então se preciso retornar todas propriedades de uma classe com Criteria, seria assim:

Criteria critera = session.createCriteria(Produto.class)

List lista = criteria.list();

Mais simples que HQL. Este é o mesmo resultado com o from Produtos que executamos no HQL e que fazemos no SQL: SELECT * from mytable.

Vamos dizer que precisamos obter os produtos que tenham no nome “smart phone” então precisamos conhecer o método add() da classe Criteria que tem como objetivo adicionar uma restrição em seu argumento. Uma outra classe importante é Restrictions class do pacote org.hibernate.Criterion que possui métodos static para as condições de restrições que precisamos. Veja o trecho do código:

Criteria crit = sesion.createCriteria(Produto.class)

crti.add(Resctrictions.eq(“nome”, “smart phone”);

List list = crit.list();

Explicando o código:

Na primeira linha criamos o objeto Criteria que fez a persistência em nossa entidade. Na linha dois costumo ler da seguinte forma para facilitar a compreensão: “adicionando uma restrição a class persistida”. Na linha 3 é o resultado da restrição.

Um ponto importante é que não podemos fazer uma restrição de resultado usando o método eq/ne para propriedades com o valor null. Para isso há um método static especifico o isNull() e o isNotNull().

Para realizar busca temos os métodos like() e ilike() estes servem quando precisamos buscar algo fornecendo “meia duzia” de informação para o buscador. Exemplo: traga todos os produtos que tem na palavra “smart”. A diferença é que o ilike é case-insensitive.

Outro detalhe importante que podemos informar aonde buscaremos a palavra, ou seja, no inicio, no final, ser exato, ou em qualquer lugar. Exemplo:

Criteria crit = session.createCriteria(Produto.class)

crit.add(Restrictions.like(“nome”, “smart%”));

List list = crit.list();

% informa que busca por partes da string. No exemplo a seguir digo para buscar no final da String.

Crit.add(Restrictions.like(“nome”, “smart”, MatchMode.end));

MatchMode é um tipo de enumeration que possui 4 tipos diferentes de match: anywhere, end, exact, start.

Done! E assim finalizo o primeiro post sobre Criteria, no próximo veremos mais algumas restrições interessantes.

Espero que tenham gostado do post.

Abracos, see you next post! 🙂