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.
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();
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");
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.
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());