L'API ObjectQuery propose des méthodes permettant d'interroger les données de l'ObjectGrid stockées à l'aide de cette même API ObjectMap. Lorsqu'un schéma est défini dans l'instance ObjectGrid, l'API ObjectQuery permet de créer et exécuter des requêtes sur les objets hétérogènes stockés dans les mappes d'objet.
Vous pouvez utiliser une fonction de requête étendue pour les objets stockés à l'aide de l'API ObjectMap. Ce type de requête permet d'extraire des objets à l'aide d'attributs non clés et d'exécuter des agrégations simples telles que des additions, des moyennes, des minima et des maxima pour toutes les données correspondant à une requête. Les applications construisent des requêtes à l'aide de la méthode Session.createObjectQuery. Cette méthode renvoie un objet ObjectQuery que vous pouvez également interroger pour obtenir les résultats de la requête. Il est aussi possible de personnaliser la requête avant de l'exécuter. La requête est exécutée automatiquement lorsqu'une méthode renvoyant un résultat est appelée.
Les mappes d'objet permettent de stocker des objets sous différentes formes et ne tiennent pas compte du format. Un schéma doit être défini dans l'ObjectGrid pour déterminer le format des données. Un schéma est composé des éléments suivants :
Pour plus d'informations, reportez-vous à la rubriqueConfiguration d'une ObjectQuery.
Pour un exemple de création d'un schéma à l'aide d'un programme ou en utilisant un fichier descripteur XML d'ObjectGrid, voir Tutoriel ObjectQuery - Etape 3.
L'interface ObjectQuery permet l'interrogation d'objets non entité, à savoir des objets hétérogènes stockés directement dans les mappes d'objet de l'ObjectGrid. L'API ObjectQuery constitue un moyen pratique de rechercher des objets ObjectMap sans recourir directement aux mécanismes d'index.
Il existe deux méthodes d'extraction des résultats à partir d'une ObjectQuery : getResultIterator et getResultMap.
Extraction des résultats d'une requête à l'aide de la méthode getResultIterator
Les résultats d'une requête représentent en fait une liste d'attributs. Imaginons la requête suivante : select a,b,c from X where y=z. Une liste de lignes contenant a, b et c est renvoyée. Cette liste est stockée dans une mappe de portée transaction, ce qui signifie que vous devez associer une clé artificielle à chaque ligne et utiliser un entier qui augmente à chaque ligne. Cette mappe est obtenue à l'aide de la méthode ObjectQuery.getResultMap(). Vous pouvez accéder aux éléments de chaque ligne à l'aide de lignes de code semblables à l'exemple qui suit :
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 ]);
}
Extraction des résultats d'une requête à l'aide de getResultMap
Les résultats d'une requête peuvent également être extraits directement à l'aide de la mappe de résultats. L'exemple suivant présente comment extraire certaines parties des clients correspondant à la requête et montre comment accéder aux lignes de résultats. Notez que si vous utilisez l'objet ObjectQuery pour accéder aux données, l'identificateur généré pour la ligne de la valeur de type long est masqué. Il est visible uniquement lorsque l'ObjectMap est utilisée pour accéder au résultat.
Une fois la transaction terminée, la mappe disparaît. Celle-ci est visible uniquement par la session utilisée, c'est-à-dire, normalement, par l'unité d'exécution qui l'a créée. La mappe utilise une clé de type Long qui représente l'identificateur de la ligne. Les valeurs stockées dans la mappe sont de type Object ou Object[], où chaque élément correspond au type d'élément dans la clause select de la requête.
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]);
}
Pour des exemples d'utilisation de l'ObjectQuery, voir Tutoriel : interrogation d'une grille de données en mémoire locale.