Consultas Simples com EntityManager

WebSphere eXtreme Scale é fornecido com a API de consulta de EntityManager.

A API de consulta EntityManager é muito semelhante a outros mecanismos de consulta SQL que pesquisam sobre objetos. Uma consulta é definida, então o resultado é recuperado da consulta utilizando vários métodos getResult.

Os exemplos a seguir referem-se às entidades usadas no tutorial do EntityManager na Visão Geral do Produto.

Executando uma Consulta Simples

Neste exemplo, os clientes com o sobrenome Claus são consultados:

em.getTransaction().begin();

  Query q = em.createQuery("select c from Customer c where c.surname='Claus'");

  Iterator iter = q.getResultIterator();
  while(iter.hasNext())
  {
    Customer c = (Customer)iter.next();
    System.out.println("Found a claus with id " + c.id);
  }

  em.getTransaction().commit();

Utilizando Parâmetros

Como você quer localizar todos os clientes com um sobrenome Claus, um parâmetro para especificar o sobrenome é utilizado, visto que você pode utilizar essa consulta mais de uma vez.

Exemplo de Parâmetro Posicional

Query q = em.createQuery("select c from Customer c where c.surname=?1");
  q.setParameter(1, "Claus");

O uso de parâmetros é muito importante quando a consulta é utilizada mais de uma vez. O EntityManager precisa analisar a cadeia de consultas e construir um plano para a consulta, o qual é caro. Utilizando um parâmetro, o EntityManager armazena em cache o plano para a consulta, reduzindo, assim, o tempo que leva para executar uma consulta.

Os parâmetros posicionais e nomeados são utilizados:

Exemplo de Parâmetro Nomeado

Query q = em.createQuery("select c from Customer c where c.surname=:name");
  q.setParameter("name", "Claus");

Utilizando um Índice para Melhorar o Desempenho

Se houver milhões de clientes, a consulta anterior precisará varrer sobre todas as linhas no Mapa do Cliente. Isso não é muito eficiente. Mas o eXtreme Scale fornece um mecanismo para definição de índices sobre atributos individuais em uma entidade. A consulta automaticamente utiliza este índice quando apropriado, o que pode acelerar as consultas dramaticamente.

Você pode especificar quais atributos relacionar muito simples, utilizando a anotação @Index no atributo entity:

@Entity
public class Customer
{
  @Id String id;
  String firstName;
  @Index String surname;
  String address;
  String phoneNumber;
}

O EntityManager cria um índice ObjectGrid apropriado para o atributo surname na entidade Customer e o mecanismo de consulta utiliza automaticamente o índice, o qual diminui bastante o tempo da consulta.

Utilizando a Paginação para Melhorar o Desempenho

Se houver um milhão de clientes chamados Claus, provavelmente você não vai querer exibir uma página que mostra um milhão de clientes. É mais provável que você queira exibir 10 ou 25 clientes de uma vez.

Os métodos Query setFirstResult e setMaxResults ajudam apenas a retornar um subconjunto dos resultados.

Exemplo de Paginação

Query q = em.createQuery("select c from Customer c where c.surname=:name");
  q.setParameter("name", "Claus");
  // Display the first page
  q.setFirstResult=1;
  q.setMaxResults=25;
  displayPage(q.getResultIterator());

  // Display the second page
  q.setFirstResult=26;
  displayPage(q.getResultIterator());