Beispielabfragen mit EntityManager

Mit WebSphere eXtreme Scale wird die EntityManager-API "Query" bereitgestellt.

Die EntityManager-API "Query" ist der SQL anderer Abfragesteuerkomponenten, die Abfragen über Objekte ausführen, sehr ähnlich. Es wird eine Abfrage definiert, und anschließend wird das Ergebnis über verschiedene getResult-Methoden aus der Abfrage abgerufen.

Die folgenden Beispiele beziehen sich auf die Entitäten, die im Lernprogramm zu EntityManager in der "Produktübersicht" verwendet werden.

Einfache Abfrage ausführen

In diesem Beispiel werden Kunden (Customer) mit dem Nachnamen "Claus" abgefragt:

em.getTransaction().begin();

  Query q = em.createQuery("select c from Customer c where c.surname='Claus'");

  Iterator iter = q.getResultIterator();
  		while(iter.hasNext())
  {
    Customer c = (Customer)iter.next();
    System.out.println("Found a claus with id " + c.id);
  }

  em.getTransaction().commit();

Parameter verwenden

Da Sie alle Kunden mit dem Nachnamen Claus suchen möchten, wird ein Parameter zur Angabe des Nachnamens (surname) verwendet, weil Sie diese Abfrage möglicherweise mehrfach verwenden möchten.

Beispiel für positionsgebundene Parameter

Query q = em.createQuery("select c from Customer c where c.surname=?1");
  q.setParameter(1, "Claus");

Die Verwendung von Parametern ist sehr wichtig, wenn die Abfrage mehrfach verwendet wird. EntityManager muss die Abfragezeichenfolge syntaktisch analysieren und einen Plan für die Abfrage erstellen, was kostenintensiv ist. Wenn Sie einen Parameter verwenden, stellt EntityManager den Plan für die Abfrage in den Cache, wodurch sich die Ausführungsdauer der Abfrage verkürzt.

Es werden sowohl positionsgebundene als auch benannte Parameter verwendet.

Beispiel für benannte Parameter

Query q = em.createQuery("select c from Customer c where c.surname=:name");
  q.setParameter("name", "Claus");

Index für die Verbesserung der Leistung verwenden

Wenn es Millionen von Kunden gibt, muss die vorherige Abfrage alle Zeilen in der Map "Customer" durchsuchen. Dies ist nicht sehr effizient. eXtreme Scale stellt jedoch einen Mechanismus für die Definition von Indizes für einzelne Attribute in einer Entität bereit. Die Abfrage verwendet diesen Index gegebenenfalls automatisch, was Anfragen erheblich beschleunigen kann.

Sie können ohne viel Aufwand angeben, welche Attribute indexiert werden sollen, indem Sie einfach die Annotation "@Index" im Entitätsattribut verwenden:

@Entity
public class Customer
{
  @Id String id;
  String firstName;
  @Index String surname;
  String address;
  String phoneNumber;
}

EntityManager erstellt einen entsprechenden ObjectGrid-Index für das Attribut "surname" in der Entität "Customer", und die Abfragesteuerkomponente verwendet den Index automatisch, was die Abfragezeit erheblich verringert.

Seitenaufteilung zur Verbesserung der Leistung verwenden

Wenn es eine Million von Kunden mit dem Namen Claus gibt, wollen Sie wahrscheinlich keine Seite anzeigen, auf der eine Million Kunden angezeigt werden. Wahrscheinlich finden Sie eine Anzeige von jeweils 10 bis 25 Kunden sehr viel angemessener.

Die Abfragemethoden "setFirstResult" und "setMaxResults" helfen hierbei, weil sie nur einen Teil der Ergebnisse zurückgeben.

Beispiel für Seitenaufteilung

Query q = em.createQuery("select c from Customer c where c.surname=:name");
  q.setParameter("name", "Claus");
  // Erste Seite anzeigen
  q.setFirstResult=1;
  q.setMaxResults=25;
  displayPage(q.getResultIterator());

  // Zweite Seite anzeigen
  q.setFirstResult=26;
  displayPage(q.getResultIterator());