WebSphere eXtreme Scale incluye la API de consulta EntityManager.
La API de consulta EntityManager es muy similar a otros motores de consulta SQL que realizan consultas en objetos. Se define una consulta, y el resultado se recupera de la consulta mediante diversos métodos getResult.
Los siguientes ejemplos hacen referencia a las entidades utilizadas en la guía de aprendizaje EntityManager en la visión general del producto.
En este ejemplo, se realiza una consulta en los clientes con el apellido Claus:
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();
Puesto que desea buscar todos los clientes que se apelliden Claus, se utiliza un parámetro para especificar el apellido ya que puede que deba realizar esta consulta más de una vez.
Ejemplo de parámetro posicional
Query q = em.createQuery("select c from Customer c where c.surname=?1");
q.setParameter(1, "Claus");
El uso de parámetros es muy importante si la consulta se va a utilizar más de una vez. EntityManager debe analizar la serie de consulta y crear un plan para la consulta, lo cual resulta costoso. Mediante el uso de un parámetro, EntityManager almacena en memoria caché el plan de la consulta, por lo que se reduce el tiempo que se tarda en ejecutar una consulta.
Se utilizan los parámetros posicionales y los parámetros con nombre:
Ejemplo de parámetro con nombre
Query q = em.createQuery("select c from Customer c where c.surname=:name");
q.setParameter("name", "Claus");
Si hubiera millones de clientes, la consulta anterior tendría que explorar todas las filas de la correlación de clientes. Esto no es muy eficiente. Pero eXtreme Scale proporciona un mecanismo para definir índices en atributos individuales en una entidad. La consulta utiliza de forma automática este índice cuando corresponda, lo cual acelera las consultas significativamente.
Puede especificar qué atributos indizar; el procedimiento es sencillo, basta con utilizar la anotación @Index en el atributo de la entidad:
@Entity
public class Customer
{
@Id String id;
String firstName;
@Index String surname;
String address;
String phoneNumber;
}
EntityManager crea un índice ObjectGrid apropiado para el atributo de apellido en la entidad Customer, que el motor de consultas utiliza automáticamente. De esta manera, se reduce drásticamente el tiempo de la consulta.
Si hubiera un millón de clientes con el apellido Claus, no sería útil mostrar una página con el millón de clientes. Lo más conveniente sería mostrar 10 o 25 clientes cada vez.
Con los métodos Query setFirstResult y setMaxResults se puede especificar que sólo se devuelva un subconjunto de los resultados.
Ejemplo de paginación
Query q = em.createQuery("select c from Customer c where c.surname=:name");
q.setParameter("name", "Claus");
// Mostrar la primera página
q.setFirstResult=1;
q.setMaxResults=25;
displayPage(q.getResultIterator());
// Mostrar la segunda página
q.setFirstResult=26;
displayPage(q.getResultIterator());