Beispiele für Abfragen über speicherinterne Java-Objektgruppen

Die folgenden Beispiele zeigen das Implementieren von Abfragen über speicherinterne Objektgruppen in pureQuery.

Beispiel einer einfachen Abfrage einer Objektgruppe

In diesem Beispiel ist die Objektgruppe ein Objekt java.util.List und eine Implementierung der Schnittstelle java.lang.Iterable. Wenn Sie eine gespeicherte Liste von Customer-Objekten zurückgeben, können Sie mehrere Fragen über diese Daten stellen, ohne dass Sie erneut auf die verbundene Datenquelle zugreifen müssen.

Angenommen, Sie wollen herausfinden, wie viele Kunden es in der Verkaufsregion San Francisco Bay Area gibt. Ihr Code könnte wie folgt aussehen:

Connection con = DriverManager.getConnection(...);    1 

Data db = DataFactory.getData(con);                   2 

Data qocdata = DataFactory.getData();                 3 

List<Customer> customers = db.queryList(              4 
  "SELECT * from SALES.CUSTOMER", Customer.class);

db.close();                                           5 

int sanFranCode = ...                                 6 

Integer countCity = qocdata.queryFirst(               7 
"SELECT COUNT(*) FROM ?1.com.company.Customer AS cr WHERE cr.storeRegion = ?2",
Integer.class, customers, sanFranCode );

qocdata.close();                                      8 

Der Code führt die folgenden Schritte aus:

  1. Stellt eine Verbindung zur Datenbank her.
  2. Erstellt eine Instanz der Implementierung der Schnittstelle Data. Da ein Verbindungsobjekt an den Konstruktor übergeben wird, können Sie die Methoden in der Implementierung zum Ausführen von SQL für eine Datenbank verwenden.
  3. Erstellt eine weitere Implementierung der Schnittstelle Data. Da kein Verbindungsobjekt an den Konstruktor übergeben wird, können Sie die Methoden in dieser Implementierung nur für Abfragen über Objektgruppen verwenden.
  4. Fragt die Datenbank für alle Kunden ab und gibt die Kundendatensätze als Customer-Objekte in der Kundenliste zurück.
  5. Schließt die Verbindung zur Datenbank.
  6. Legt den Wert für die Verkaufsregion San Francisco Bay Area fest.
  7. Fragt die Customer-Objekte in der Liste ab und gibt die Anzahl der Kunden zurück, die in der Zielverkaufsregion gefunden wurden.
  8. Schließt alle Ressourcen, die von qocdata verwendet werden, und gibt sie frei.

Statt qocdata zu schließen, können Sie zusätzliche Analysen der Kunden wie die im nächsten Beispiel gezeigte ausführen.

Beispiel einer komplexen Abfrage einer Objektgruppe

Angenommen, Sie benötigen für einen Bericht an das Management die Anzahl von Städten in der Verkaufsregion San Francisco Bay Area und die Namen der fünf größten Städte (gemessen an der Anzahl verschiedener Adressen) in dieser Region. Dann soll nach Genehmigung durch das Management eine Mailing-Kampagne für Kunden in diesen Städten gestartet werden.

Sie können eine Abfrage einer verbundenen Datenquelle und eine kleine Menge Anwendungslogik, die mit Annotationen versehene Methoden nutzt, um drei Abfragen über Objektgruppen einzubinden, verwenden.

Zuerst benötigen Sie eine Zwischenspeicherungsklasse, die von der aufrufenden Anwendung und den mit Annotationen versehenen Methoden verwendet wird:

public class CitySize {
  public String city;
  public Integer size;
}

Da Sie die Methoden nicht in einer Implementierungsklasse für Abfragen über Objektgruppen mit Abfragen von Datenbanken verwenden können, müssen Sie zwei verschiedene Schnittstellen erstellen.

Die Schnittstelle CustomerQuery definiert die Methode zum Abfragen der Datenquelle. Die Methode getCustomersInRegion() gibt eine Liste von Customer-Objekten zurück, die Kunden in einer angegebenen Verkaufsregion darstellen.

import com.company.Customer; 
public interface CustomerQuery
 {
   @Select(sql=
    "SELECT custId, name, ... FROM Customer WHERE region=?1")
   List<Customer> getCustomersInRegion(int r);
 }

Die Schnittstelle RegionReport definiert die Methoden zum Abfragen des Objektgruppenobjekts.

import com.company.Customer;
import com.company.Campaign.CitySize;
public interface RegionReport
{
  @Select(sql="SELECT COUNT(DISTINCT city) FROM ?1")
  public Integer countCities (List<Customer> curRegion);

  @Select(sql=
     "SELECT city, COUNT(DISTINCT addressL1) AS size " +
     " FROM ?1 GROUP BY city ORDER BY size DESC")
  public CitySize[] getCitySize(List<Customer> curRegion);

  @Select(sql="SELECT cr.this FROM ?1 AS cr, ?2 AS t5 " +
            " WHERE cr.city = t5.city ")  
  List<Customer> getMailingList(List<Customer> curRegion,
                       CitySize[] topFive);
}
Die Methoden führen die folgenden Funktionen aus:
public Integer countCities (List<Customer> curRegion)
In einer Liste der Kunden der aktuellen Region Ermitteln der Anzahl der Städte, in denen die Kunden sich befinden.
public CitySize[] getCitySize(List<Customer> curRegion)
In einer Liste der Kunden der aktuellen Region Ermitteln der Größe jeder Stadt auf der Basis der Anzahl verschiedener Adressen und Übergabe eines Arrays von CitySize-Objekten, die in absteigender Größe angeordnet sind.
List<Customer> getMailingList(List<Customer> curRegion, CitySize[] topFive)
Aus einer Liste der Kunden der aktuellen Region Auswahl aller Kunden, deren Stadt in einer Liste von Städten enthalten ist. Die Verwendung von 'this' bewirkt, dass das wirkliche Objekt abgefragt wird, in diesem Fall aus 'List<Customer> curRegion', und in die Liste 'List<Customer>' aufgenommen wird, die von getMailingList zurückgegeben wird. Eine ähnliche Abfrage, die 'cr.*' auswählt, führt in der Regel dazu, dass eine Kopie der abgefragten Objekte übergeben wird.

Nachdem Sie Implementierungsklassen für die Schnittstelle generiert haben, können Sie den Bericht an das Management und die Liste der anvisierten Kunden mit Anwendungslogik, die wie folgt aussieht, erzeugen:

 Connection con = DriverManager.getConnection(...);                    1 
 CustomerQuery cQuery = 
    DataFactory.getData( CustomerQuery.class, con );                   2 

 RegionReport inMem =
    DataFactory.getData( RegionReport.class );                         3 

 int sanFranCode = ...;                                                4 

 List<Customer> customers = cQuery.getCustomersInRegion(sanFranCode);  5 

cQuery.close();                                                        6 

 Integer cityCount = inMem.countCities(customers);                     7 
 System.out.println (                                                  8 
   " There are " + cityCount + " cities in region " + sanFranCode );
 System.out.println (
   " The largest 5, and their number of addresses are: " );

 CitySize[] allCityList = inMem.getCitySize(customers);                9 
 CitySize[] topFive = new CitySize[5];                                 10 
 for (int i=0; i<5; i++)                                               11 
 {  topFive[i] = allCityList[i];
    System.out.println (
      "   " + topFive[i].city + "  " + topFive[i].size);
 }

 List<Customer> mailingCust =                                          12 
         inMem.getMailingList(customers, topFive);

inMem.close();                                                         13 

Der Code führt die folgenden Schritte aus:

  1. Stellt eine Verbindung zur Datenbank her.
  2. Erstellt eine Instanz der Implementierung der Schnittstelle CustomerQuery. Da ein Verbindungsobjekt an den Konstruktor übergeben wird, können Sie die Methoden in der Implementierung zum Ausführen von SQL für eine Datenbank verwenden.
  3. Erstellt eine Instanz der Implementierung der Schnittstelle RegionReport. Da kein Verbindungsobjekt an den Konstruktor übergeben wird, können Sie die Methoden in dieser Implementierung nur für Abfragen über Objektgruppen verwenden.
  4. Legt den Wert für die Verkaufsregion San Francisco Bay Area fest.
  5. Füllt die Kundenliste mit Customer-Objekten zu den Kunden, die in der Zielverkaufsregion enthalten sind.
  6. Schließt alle Ressourcen, die von cQuery verwendet werden, und gibt sie frei.
  7. Ruft die Anzahl der verschiedenen Städte ab, in denen sich die Kunden befinden.
  8. Druckt den ersten Teil des Berichts.
  9. Ruft ein Array mit CitySikze-Objekten ab: ein Objekt für jede Stadt, in der sich Kunden befinden.
  10. Erstellt ein Array des Typs CitySize zur Aufnahme der CitySize-Objekte für die fünf größten Städte.
  11. Druckt den Namen und die Größe der fünf größten Städte.
  12. Ruft eine Liste der Kunden in den fünf größten Städten ab.
  13. Schließt alle Ressourcen, die von inMem verwendet werden, und gibt sie frei.

Wenn das Management entscheidet, dass das Zielmailing zu klein oder zu groß ist, ist lediglich eine kleine Änderung bei der zugewiesenen Größe des Arrays CitySize und der Schleife, die Daten in es schreibt, erforderlich, um Customer-Objekte in der schließlich erzeugten Liste mailingCust hinzuzufügen oder aus dieser zu entfernen. Die Methode getMailingList() hängt nicht von der Größe ihres Eingabe-Arrays ab.


Feedback