Recuperación de entidades y objetos (API de consulta)

WebSphere eXtreme Scale proporciona un motor de consultas flexible para recuperar entidades utilizando la API EntityManager y los objetos Java mediante la API ObjectQuery.

Funciones de consulta de WebSphere eXtreme Scale

Con el motor de consultas de eXtreme Scale, puede realizar las consultas del tipo SELECT en una entidad o esquema basado en objeto mediante el lenguaje de consulta de eXtreme Scale.

Este lenguaje de consulta ofrece las funciones siguientes:

Interfaz de consultas

Utilice la interfaz de consultas para controlar la ejecución de consultas de entidad.

Utilice el método EntityManager.createQuery(String) para crear una consulta. Puede utilizar cada una de las instancias de consulta varias veces con la instancia de EntityManager en la que se recuperó.

Cada resultado de consulta genera una entidad, donde la clave de la entidad es el ID de la fila (de tipo long) y el valor de la entidad contiene los resultados del campo de la cláusula SELECT. Puede utilizar cada resultado de consulta en posteriores consultas.

Los métodos siguientes están disponibles en la interfaz com.ibm.websphere.objectgrid.em.Query.

public ObjectMap getResultMap()

El método getResultMap ejecuta una consulta SELECT y devuelve los resultados en un objeto ObjectMap con los resultados en el orden especificado por la consulta. El objeto ObjectMap resultante es sólo válido para la transacción actual.

La clave de la correlación es el número de resultado, de tipo long, que empieza por 1. El valor de la correlación es de tipo com.ibm.websphere.projector.Tuple donde cada atributo y asociación se denomina en función de su posición ordinal dentro de la cláusula SELECT de la consulta. Utilice este método para recuperar el objeto EntityMetadata para el objeto Tuple almacenado dentro de la correlación.

El método getResultMap es el método más rápido para recuperar los datos del resultado de la consulta donde pueden existir varios resultados. Puede recuperar el nombre de la entidad resultante mediante los métodos ObjectMap.getEntityMetadata() y EntityMetadata.getName().

Ejemplo: la consulta siguiente devuelve dos filas.

String ql = SELECT e.name, e.id, d from Employee e join e.dept d WHERE d.number=5
 Query q = em.createQuery(ql);
 ObjectMap resultMap = q.getResultMap();
 long rowID = 1; // empieza con el índice 1
 Tuple tResult = (Tuple) resultMap.get(new Long(rowID));
 while(tResult != null) {
     // El primer atributo es name y tiene un nombre de atributo de 1
     // Pero tiene una posición ordinal de 0.
     String name = (String)tResult.getAttribute(0);
     Integer id = (String)tResult.getAttribute(1);

     // Dept es una asociación con un nombre 3, pero
     // una posición ordinal de 0 ya que es la primera asociación.
     // La asociación es siempre una relación de uno a uno,
     // por lo que sólo hay una clave.
     Tuple deptKey = tResult.getAssociation(0,0);
     ...
     ++rowID;
     tResult = (Tuple) resultMap.get(new Long(rowID));

 }

public Iterator getResultIterator

El método getResultIterator ejecuta una consulta SELECT y devuelve los resultados de la consulta utilizando un Iterator donde cada resultado es un Object para una consulta de valor único, o una matriz de Object para una consulta de varios valores. Los valores del resultado Object[] se almacenan en el orden de la consulta. El objeto Iterator resultante es sólo válido para la transacción actual.

Este método es preferido para recuperar los resultados de la consulta dentro del contexto EntityManager. Puede utilizar de forma opcional el método setResultEntityName(String) para nombrar la entidad resultante, de modo que pueda utilizarse en otras consultas.

Ejemplo: la consulta siguiente devuelve dos filas.

String ql = SELECT e.name, e.id, e.dept from Employee e WHERE e.dept.number=5
 Query q = em.createQuery(ql);
 Iterator results = q.getResultIterator();
 while(results.hasNext()) {
     Object[] curEmp = (Object[]) results.next();
     String name = (String) curEmp[0];
     Integer id = (Integer) curEmp[1];
     Dept d = (Dept) curEmp[2];
     ...
 }

public Iterator getResultIterator(Class resultType)

El método getResultIterator(Class resultType) ejecuta una consulta SELECT y devuelve los resultados de la consulta utilizando una instancia de Iterator. El tipo de entidad está determinado por el parámetro resultType. El objeto Iterator resultante es sólo válido para la transacción actual.

Utilice este método cuando desee utilizar las API EntityManager para acceder a las entidades resultantes.

Ejemplo: las consulta siguiente devuelve todos los empleados de una división y el departamento al que pertenecen, ordenados por sueldo. Para imprimir los cinco empleados con el sueldo más alto y seleccionar trabajar con empleados de sólo un departamento en el mismo conjunto de trabajo, utilice este código:

String string_ql = "SELECT e.name, e.id, e.dept from Employee e WHERE
		e.dept.division='Manufacturing' ORDER BY e.salary DESC";
Query query1 = em.createQuery(string_ql);
query1.setResultEntityName("AllEmployees");
Iterator results1 = query1.getResultIterator(EmployeeResult.class);
int curEmployee = 0;
System.out.println("Highest paid employees");
while (results1.hasNext() && curEmployee++ < 5) {
	EmployeeResult curEmp = (EmployeeResult) results1.next();			
	System.out.println(curEmp);
	// Eliminar empleado del conjunto de resultados.
	em.remove(curEmp);
}

// Vaciar los cambios en la correlación de resultados.
em.flush();

// Ejecutar una consulta en el conjunto de trabajo local sin los empleados
// eliminados
String string_q2 = "SELECT e.name, e.id, e.dept from AllEmployees e
		WHERE e.dept.name='Hardware'";
Query query2 = em.createQuery(string_q2);
Iterator results2 = query2.getResultIterator(EmployeeResult.class);
System.out.println("Subset list of Employees");
while (results2.hasNext()) {
	EmployeeResult curEmp = (EmployeeResult) results2.next();			
	System.out.println(curEmp);
}

public Object getSingleResult

El método getSingleResult ejecuta una consulta SELECT que devuelve un único resultado.

Si la cláusula SELECT tiene más de un campo definido, el resultado es una matriz de objetos, donde cada elemento de la matriz se basa en su posición ordinal dentro de la cláusula SELECT de la consulta.

String ql = SELECT e from Employee e WHERE e.id=100"
 Employee e = em.createQuery(ql).getSingleResult();

 String ql = SELECT e.name, e.dept from Employee e WHERE e.id=100"
 Object[] empData = em.createQuery(ql).getSingleResult();
 String empName= (String) empData[0];
 Department empDept = (Department) empData[1];

public Query setResultEntityName(String entityName)

El método setResultEntityName(String entityName) especifica el nombre de la entidad del resultado de la consulta.

Cada vez que se invocan los métodos getResultIterator o getResultMap, se crea dinámicamente una entidad con ObjectMap para que contenga los resultados de la consulta. Si la entidad no se especifica, o es nula, el nombre de ObjectMap y la entidad se generan automáticamente.

Como todos los resultados de la consulta están disponibles durante una transacción, no puede volver a usarse un nombre de consulta en una única transacción.

public Query setPartition(int partitionId)

Establezca la partición a la que se direcciona la consulta.

Este método es necesario si las correlaciones de la consulta se particionan y si el gestor de entidades no tiene afinidad con una partición única de entidad raíz de esquema.

Utilice PartitionManager Interface para determinar el número de particiones para la correlación de respaldo de una entidad dada.

La siguiente tabla proporciona descripciones de otros métodos que están disponibles a través de la interfaz de la consulta.

Tabla 1. Otros métodos
Método Resultado
public Query setMaxResults(int maxResult) Establece el número máximo de resultados que se va a recuperar.
public Query setFirstResult(int startPosition) Establece la posición del primer resultado que se va a recuperar.
public Query setParameter(String name, Object value) Enlaza un argumento con un parámetro con nombre.
public Query setParameter(int position, Object value) Enlaza un argumento con un parámetro posicional.
public Query setFlushMode(FlushModeType flushMode) Establece el tipo de modalidad de vaciado que se va a utilizar cuando se ejecuta la consulta, que alterará temporalmente el tipo de modalidad de vaciado establecido en EntityManager.

Elementos de las consultas de eXtreme Scale

Con el motor de consultas de eXtreme Scale, puede utilizar un lenguaje de consultas para realizar búsquedas en la memoria caché de eXtreme Scale. Este lenguaje de consulta puede consultar los objetos Java que están almacenados en los objetos ObjectMap y los objetos Entity. Use la sintaxis siguiente para crear una serie de consulta.

Una consulta de eXtreme Scale es una serie que contiene los elementos siguientes:
  • Una cláusula SELECT que especifica los objetos y valores que se van a devolver.
  • Un cláusula FROM que nombra las colecciones de objetos.
  • Una cláusula WHERE opcional que contiene predicados de búsqueda en las colecciones.
  • Una cláusula GROUP BY y HAVING opcional (consulte las funciones de agregación de consultas de eXtreme Scale).
  • Una cláusula ORDER BY opcional que especifica el orden de la colección de resultados.

Las colecciones de objetos Java se identifican en las consultas a través del uso del nombre en la cláusula FROM de la consulta.

Los elementos del lenguaje de consultas se describen con más detalle en los siguientes temas relacionados:
Los temas siguientes describen los métodos para utilizar la API Query: