Uso da API ObjectQuery

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.

Consulta e 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.

Figura 1. A interação da consulta com os mapas de objetos e como um esquema é definido para classes e associado a um mapa ObjectGrid
Esquema do ObjectQuery, sessão e aplicativo

Definindo um Esquema do ObjectMap

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:

  • O tipo de objeto armazenado no ObjectMap
  • Relacionamentos entre ObjectMaps
  • O método ao qual cada consulta acessa os atributos de dados nos objetos (campos e métodos de propriedade)
  • O nome do atributo da chave primária no objeto.

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.

Consultando Objetos com a API do ObjectQuery

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.