A API ObjectQuery fornece métodos para consulta de dados no ObjectGrid que são armazenados usando a API ObjectMap. Quando um esquema é definido na instância do ObjectGrid, a API do ObjectQuery pode ser usada para criar e executar consultas sobre os objetos heterogêneos armazenados nos mapas de objetos.
Você pode usar uma capacidade de consulta avançada para objetos que são armazenados usando a API do ObjectMap. Essas consultas permitem que os objetos sejam recuperados utilizando os atributos não-chave e executem agregações simples, como sum, avg, min e max junto a todos os dados que correspondem a uma consulta. Os aplicativos podem construir uma consulta usando o método Session.createObjectQuery. Ese método retorna um objeto ObjectQuery que pode ser então interrogado para se obter os resultados da consulta. O objeto de consulta também permite que a consulta seja customizada antes de executá-la. A consulta é executada automaticamente quando qualquer método que retorna o resultado é chamado.
Os mapas de objetos são usados para armazenar objetos em várias formas e são largamente livres de formatos. Um esquema deve ser definido no ObjectGrid que define o formato dos dados. Um esquema é composto das seguintes partes:
Consulte o esquema Configurando um ObjectQuery para obter detalhes.
Para obter um exemplo sobre a criação de um esquema programaticamente ou usando o arquivo XML descritor do ObjectGrid, consulte Tutorial do ObjectQuery - Etapa 3.
A interface ObjectQuery permite a consulta de objetos de não-entidade, que sejam objetos heterogêneos e estejam armazenados nos ObjectMaps do ObjectGrid. A API ObjectQuery fornece uma maneira fácil de localizar os objetos ObjectMap sem usar o mecanismo de índice diretamente.
Há dois métodos para recuperação de resultados de um ObjectQuery: getResultIterator e getResultMap.
Recuperando resultados da consulta utilizando getResultIterator
Basicamente, os resultados de consultas são uma lista de atributos. Suponha que a consulta for selecionar a,b,c de X, em que y=z. Esta consulta retorna uma lista de linhas contendo a, b e c. Esta lista é armazenada em um Mapa com escopo em transação, o que significa que você deve associar uma chave artificial a cada linha e utilizar um número inteiro que aumenta a cada linha. Este mapa é obtido utilizando o método ObjectQuery.getResultMap(). É possível acessar os elementos de cada linha utilizando o código semelhante ao seguinte:
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 ]);
}
Recuperando resultados da consulta utilizando getResultMap
Os resultados da consulta também podem ser recuperados utilizando diretamente o mapa de resultados. O exemplo a seguir mostra uma consulta recuperando partes específicas dos Clientes correspondentes e demonstra como acessar as linhas resultantes. Observe que, se você utilizar o objeto ObjectQuery para acessar os dados, então o identificador de linha longa gerado será ocultado. A linha longa é visível somente ao utilizar o ObjectMap para acessar o resultado.
Quando a transação é concluída, este mapa desaparece. O mapa também está visível apenas na sessão utilizada, ou seja, geralmente apenas no encadeamento que o criou. O mapa utiliza uma chave do tipo Long que representa o ID da linha. Os valores armazenados no mapa são do tipo Object ou Object[], em que cada elemento corresponde ao tipo do elemento na cláusula select da 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 obter exemplos sobre o uso do ObjectQuery, consulte Tutorial: Consultando uma Grade de Dados na Memória Local.