API "ObjectQuery" verwenden

Die API "ObjectQuery" stellt Methoden für die Abfrage von Daten im ObjectGrid bereit, die mit der API "ObjectMap" gespeichert wurden. Wenn ein Schema in der ObjectGrid-Instanz definiert ist, kann die API "ObjectQuery" verwendet werden, um Abfragen für die heterogenen Objekte, die in den ObjectMaps gespeichert sind, zu erstellen und auszuführen.

Abfrage und ObjectMaps

Sie können eine erweiterte Abfragefunktion für Objekte verwenden, die mit der API "ObjectMap" gespeichert wurden. Diese Abfragen unterstützen den Abruf von Objekten über Attribute ohne Schlüsselfunktion und führen einfache Aggregationen wie sum, avg, min und max für alle Daten aus, die einer Abfrage entsprechen. Anwendungen können eine Abfrage mit der Methode "Session.createObjectQuery" erstellen. Diese Methode gibt ein ObjectQuery-Objekt zurück, das anschließend abgefragt werden kann, um die Abfrageergebnisse zu erhalten. Das Query-Objekt lässt auch die Anpassung der Abfrage zu, bevor die Abfrage ausgeführt wird. Die Abfrage wird automatisch ausgeführt, wenn eine Methode aufgerufen wird, die das Ergebnis zurückgibt.

Abbildung 1. Interaktion der Abfrage mit den ObjectGrid-ObjectMaps, Definition eines Schemas für Klassen und Zuordnung des Schemas zu einer ObjectGrid-Map
ObjectQuery-Schema, Session-Objekt und Anwendung

ObjectMap-Schema definieren

ObjectMaps werden zum Speichern von Objekten in verschiedenen Formen verwendet und kennen das Format im Großen und Ganzen nicht. Es muss ein Schema im ObjectGrid definiert werden, das das Format der Daten definiert. Ein Schema setzt sich aus den folgenden Teilen zusammen:

  • dem Typ des in der ObjectMap gespeicherten Objekts,
  • den Beziehungen zwischen ObjectMaps,
  • der Methode, für die jede Abfrage auf die Datenattribute in den Objekten zugreifen muss (Feld- oder Eigenschaftsmethoden),
  • dem Namen des Primärschlüsselattributs im Objekt.

Einzelheiten hierzu finden Sie im Abschnitt ObjectQuery-Schema konfigurieren.

Ein Beispiel zum Erstellen eines Schemas über das Programm oder durch Verwendung der ObjectGrid-XML-Deskriptordatei finden Sie in Lernprogramm zu ObjectQuery - Schritt 3.

Objekte mit der API "ObjectQuery" abfragen

Die Schnittstelle "ObjectQuery" unterstützt die Abfrage von Objekten, die keine Entitäten sind, d. h. heterogenen Objekten, die direkt in den ObjectGrid-ObjectMaps gespeichert werden. Die API "ObjectQuery" ist eine einfache Methode für die Suche von ObjectMap-Objekten ohne direkte Verwendung des Indexmechanismus.

Es gibt zwei Methoden für das Abrufen von Ergebnissen aus einer ObjectQuery: getResultIterator und getResultMap.

Abfrageergebnisse mit getResultIterator abrufen

Abfrageergebnisse sind im Wesentlichen eine Liste mit Attributen. Angenommen, die Abfrage lautet "select a,b,c from X where y=z". Diese Abfrage gibt eine Liste mit Zeilen zurück, zu denen a, b und c gehören. Diese Liste ist eigentlich in einer transaktionsbezogenen Map gespeichert, d. h., Sie müssen jeder Zeile einen künstlichen Schlüssel zuordnen und einen Integer-Wert verwenden, der sich mit jeder Zeile erhöht. Diese Map wird mit der Methode "ObjectQuery.getResultMap()" abgerufen. Sie können auf die Elemente jeder Zeile mit Code wie dem folgenden zugreifen:

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 ]);
  }

Abfrageergebnisse mit getResultMap abrufen

Abfrageergebnisse können auch direkte über die Ergebnis-Map abgerufen werden. Das folgende Beispiel zeigt eine Abfrage, die bestimmte Komponenten der übereinstimmenden Customer-Objekte abruft, und veranschaulicht, wie auf die Ergebniszeilen zugegriffen wird. Wenn Sie das ObjectQuery-Objekt für den Zugriff auf die Daten verwenden, müssen Sie beachten, dass die generierte lange Zeilenkennung verborgen bleibt. Die lange Zeilenkennung ist nur sichtbar, wenn Sie die ObjectMap für den Zugriff auf das Ergebnis verwenden.

Nach Abschluss der Transaktion ist auch diese Map nicht mehr vorhanden. Die Map ist außerdem nur für die verwendete Sitzung sichtbar, d. h. normalerweise nur für den Thread, der sie erstellt hat. Die Map verwendet einen Schlüssel vom Typ "long", der die Zeilen-ID darstellt. Die in der Map gespeicherten Werte haben den Typ "Object" oder "Object[]", wobei jedes Element dem Typ des Elements in der Klausel SELECT der Abfrage entspricht.

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]);
  }

Beispiele zur Verwendung von ObjectQuery finden Sie in Lernprogramm: Lokales speicherinternes Datengrid abfragen.