La API ObjectQuery proporciona métodos para consultar datos en el ObjectGrid que se almacenan utilizando la API ObjectMap. Cuando se define un esquema en la instancia de ObjectGrid, la API ObjectQuery se puede utilizar para crear y ejecutar consultas sobre los objetos heterogéneos almacenados en las correlaciones de objeto.
Puede utilizar una capacidad de consulta ampliada para los objetos que se han almacenado utilizando la API ObjectMap. Mediante estas consultas, puede recuperar objetos mediante atributos que no son de clave y realizar agregaciones simples, como sum, avg, min y max en todos los datos que coinciden con una consulta. Las aplicaciones pueden construir una consulta utilizando el método Session.createObjectQuery. Este método devuelve un objeto ObjectQuery que se puede interrogar para obtener los resultados de la consulta. Con el objeto Query también puede personalizar la consulta antes de ejecutarla. La consulta se ejecuta automáticamente cuando se llama a cualquier método que devuelva el resultado.
Las correlaciones de objeto se utilizan para almacenar objetos en distintos formatos, de los que no son conscientes. Un esquema debe definirse en el objeto ObjectGrid que define el formato de los datos. Un esquema está formado por las siguientes partes:
Consulte el apartado Configuración de un esquema ObjectQuery para obtener más información.
Si desea ver un ejemplo de la creación de un esquema mediante programación o mediante el archivo XML de descriptor de ObjectGrid, consulte Guía de aprendizaje de ObjectQuery - Paso 3.
La interfaz ObjectQuery permite consultar objetos que no son de entidad, que son objetos heterogéneos almacenados directamente en las ObjectMaps de ObjectGrid. La API ObjectQuery proporciona una forma fácil de encontrar objetos ObjectMap sin utilizar directamente el mecanismo de índice.
Existen dos métodos de recuperar resultados de un objeto ObjectQuery: getResultIterator y getResultMap.
Recuperación de resultados de la consulta mediante getResultIterator
Los resultados de la consulta son básicamente una lista de atributos. Imagine que la consulta era seleccionar a,b,c de X donde y=z. Esta consulta devuelve una lista de filas que contiene a, b y c. Esta lista se almacena en una correlación con ámbito de transacciones, que significa que debe asociar una clave artificial con cada fila y utilizar un entero que aumente con cada fila. Esta correlación se obtiene mediante el método ObjectQuery.getResultMap(). Puede acceder a los elementos de cada fila con un código similar al siguiente:
ObjectQuery q = session.createQuery(
"select c.id, c.firstName, c.surname from Customer c where c.surname=?1");
q.setParameter(1, "Claus");
Iterator iter = q.getResultIterator();
while(iter.hasNext())
{
Object[] row = (Object[])iter.next();
System.out.println("Found a Claus with id "
+ row[objectgrid: 0 ] + ", firstName: "
+ row[objectgrid: 1 ] + ", surname: "
+ row[objectgrid: 2 ]);
}
Recuperación de resultados de la consulta mediante getResultMap
Los resultados de la consulta también se pueden recuperar mediante la correlación de resultados directamente. En el ejemplo siguiente se muestra una consulta que recupera partes específicas de clientes (Customers) coincidentes y muestra cómo acceder a las filas de resultados. Si utiliza el objeto ObjectQuery para acceder a los datos, el identificador de fila long generado no se muestra. La fila de tipo long sólo se muestra al utilizar ObjectMap para acceder al resultado.
Cuando finaliza la transacción, esta correlación desaparece. La correlación sólo está visible para la sesión utilizada, es decir, normalmente sólo para la hebra que la ha creado. La correlación utiliza una clave de tipo Long que representa el ID de la fila. Los valores almacenados en la correlación son de tipo Object u Object[], donde cada elemento coincide con el tipo de elemento de la cláusula select de la consulta.
ObjectQuery q = em.createQuery(
"select c.id, c.firstName, c.surname from Customer c where c.surname=?1");
q.setParameter(1, "Claus");
ObjectMap qmap = q.getResultMap();
for(long rowId = 0; true; ++rowId)
{
Object[] row = (Object[]) qmap.get(new Long(rowId));
if(row == null) break;
System.out.println(" I Found a Claus with id " + row[0]
+ ", firstName: " + row[1]
+ ", surname: " + row[2]);
}
Para ver ejemplos sobre cómo utilizar el ObjectQuery, consulte Guía de aprendizaje: Consulta de una cuadrícula de datos local en memoria.