Início > Programação > Criando uma Consulta Type-safe com a API de Criteria

Criando uma Consulta Type-safe com a API de Criteria

Sempre que preciso construir uma consulta dinâmica, minha primeira opção é o Criteria do Hibernate, que é uma API que permite a construção de consultas estruturadas por critérios. Trabalho com essa API faz vários anos e hoje não tenho dificuldades em utilizá-la.

Não podemos nos acomodar com o que já sabemos. Precisamos aprender outras formas de fazer a mesma coisa passando por formas diferentes de como não se fazer essa coisa, ou seja, correr o risco de errar ou simplesmente chegar a um resultado pior. Devemos ter a mente aberta e enxergar nos entraves chances para expandir nossos conhecimentos. Thomas Edison disse ao lhe perguntarem como foi errar mil vezes antes de criar a lâmpada:

Eu não errei mil vezes, eu aprendi mil formas de como não se fazer uma lâmpada

Nessa mesma linha sarcástica, um repórter perguntou como ele se sentia por ter falhado 25 mil vezes na sua tentativa de criar uma bateria. Ele respondeu:

Não sei por que você acha que foi um fracasso. Hoje eu conheço 25 mil maneiras de como não fazer uma bateria. E você, o que sabe?

Longe de desanimar, Thomas Edison dizia o seguinte:

Não desanimo porque cada tentativa errada descartada é um outro passo à frente

FRATERLUZ - Thomas Edson

Estou trabalhando em um projeto no qual decidimos utilizar EJB com JPA sem configurações específicas de um framework que lhe dê suporte, como o Hibernate, por exemplo. A JPA oferece uma API de Criteria equivalente à do Hibernate que é utilizada para definir consultas type-safe para entidades e seus estados persistentes.

A documentação da Oracle é um bom ponto de partida para a implementação das nossas consultas. Tudo começa na obtenção de CriteriaBuilder através do entity manager. Considere a entidade persistente à seguir:

@Entity
@Table(name="TBL_PACIENTE")
public class Paciente {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;
   @Column(name = "NM_NOME")
   private String nome;
   @Column(name = "CL_STATUS")
   private int status;
}

Vamos construir um Criteria que apresente todos os pacientes de sobrenome “Silva” cujos status de internação sejam 1 (Aguardando avaliação) ou 3 (Avaliado):

String nome = "Silva";
List<Integer> status = new ArrayList<Integer>();
status.add(1); // Aguardando Avaliacao
status.add(3); // Avaliado

List<Paciente> pacientes = pacienteDao.find("Silva", status);

A definição da consulta fica assim:


public List<Paciente> find(String nome, List<Integer> status) {
   CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
   CriteriaQuery<Paciente> criteriaQuery =  criteriaBuilder
      .createQuery(Paciente.class);
   Root<Paciente> rootEntity = criteriaQuery.from(Paciente.class);

   // A lista predicados contem as restricoes (WHERE)
   // do SQL que sera gerado
   List<Predicate> predicateList = new ArrayList<Predicate>();

   // Restricao aplicada ao campo nome
   Expression<String> campoNome = rootEntity.get("nome");
   Predicate predicateNome = criteriaBuilder.
      like(campoNome, "%" + nome + "%");
   predicateList.add(predicateNome);

   // Restricao aplicada ao campo status
   Expression<String> exp = rootEntity.get("status");
   Predicate predicate = exp.in(status);
   predicateList.add(predicate);
		
   Predicate[] predicates = new Predicate[predicateList.size()];
   predicateList.toArray(predicates);
   criteriaQuery.where(predicates);

   TypedQuery<Paciente> typedQuery = entityManager
      .createQuery(criteriaQuery);

   return typedQuery.getResultList();
}

Conclusão

Não tenha medo de errar e não se acomode fazendo sempre as mesmas coisas do mesmo jeito.

Anúncios
Categorias:Programação Tags:, ,

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: