Mit 'this' in SELECT-Anweisungen auf Objekte in speicherinternen Java-Objektgruppen verweisen

In SELECT-Anweisungen in Abfragen über speicherinterne Objektgruppen können Sie mit 'this' auf Objekte in Objektgruppen verweisen.
Der Verweis auf Objekte in Objektgruppen mit 'this' ist aus zwei Gründen sinnvoll:

Funktionsweise von 'this'

Für jede Objektgruppe werden die Objekte der Objektgruppe effektiv zum Inhalt einer Spalte 'this' in einer SQL-Tabelle, die den Inhalt der Objektgruppe darstellt.

pureQuery überprüft die Klasse der in einer Objektgruppe enthaltenen Objekte, um die Namen der Eigenschaften in diesen Objekten zu ermitteln. Eigenschaftsnamen werden zu Namen von Spalten in einer SQL-Tabelle und die Eigenschaftswerte werden Eigenschaftswerte in der entsprechenden Zeile der SQL-Tabelle.

Angenommen, es gibt die Objektgruppe List<Customer> mit dem Namen customers und diese Definition einer Bean 'Customer'.

public Customer {
    public Integer custId;
    public String name;
    public String addressl1;
    public String city;
    public Integer storeRegion;
 }

pureQuery könnte den Inhalt der Objektgruppe in einer virtuellen SQL-Tabelle wie folgt darstellen.

Tabelle 1. Virtuelle SQL-Tabelle für List<Customer> customers
THIS CUSTID NAME ADDRESSL1 CITY REGION
Customer-Objekt 0 001 Big Customer 1234 Market Street San Francisco 900
Customer-Objekt 1 002 Another Big Customer 5678 California Street San Francisco 900
Customer-Objekt 2 003 Still Another Big Customer 90 North First Street San Jose 900

Beispiel

Angenommen, Sie benötigen eine mit Annotationen versehene Methode, die eine Liste von Customer-Objekten abfragt und die Objekte zurückgibt, die Kunden in den fünf größten Städten einer Verkaufsregion darstellen.

Sie könnten hierfür eine Methode wie die folgende schreiben:

@Select(sql="SELECT cr.custId, cr.name, cr.addressl1, " + 
         " cr.city, cr.storeRegion " +
         " FROM ?1 AS cr, ?2 AS t5 WHERE cr.city = t5.city ")  
  List<Customer> getMailingList(List<Customer> curRegion,
                       CitySize[] topFive);
Die Klasse CitySize könnte folgende Definition haben:
public class CitySize {
  public String city;
  public Integer size;
}

Wenn Customer-Objekte aus der Liste curRegion gelesen werden, werden die ausgewählten Spaltenwerte für Objekte, bei denen die Stadt gleich einer Stadt im Array CitySize ist, verwendet, um eine neue Instanz eines Objekts Customer zu füllen, und dieses neue Objekt wird der Liste hinzugefügt, die von der Methode getMailingList() zurückgegeben wird.

Sie können auch alle Spalten in den Customer-Objekten wie folgt auswählen:

@Select(sql="SELECT cr.* " +
         " FROM ?1 AS cr, ?2 AS t5 WHERE cr.city = t5.city ")  
  List<Customer> getMailingList(List<Customer> curRegion,
                       CitySize[] topFive);

Wenn Instanzen der Customer-Objekte aus der Liste curRegion gelesen werden, werden für Objekte, bei denen die Stadt gleich einer Stadt im Array CitySize ist, alle ausgewählten Spaltenwerte (einschließlich der Spalte 'this') verwendet, um eine neue Instanz eines Objekts Customer zu füllen, und dieses neue Objekt wird der Liste hinzugefügt, die von der Methode getMailingList() zurückgegeben wird.

Diese Methoden erstellen beide neue Instanzen von Customer-Objekten, die der Abfrage entsprechen. Wenn Sie 'this' in der Liste in der Anweisung SELECT verwenden und die Objekte, die der Abfrage entsprechen, einen der folgenden Typen haben, erstellen Ihre Methoden neue Instanzen der Objekte, die ihren Abfragen ebenfalls entsprechen.
  • Primitiver Datentyp oder ein Wrapper eines primitiven Datentyps
  • byte[]
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

In diesem Beispiel werden, wenn Customer-Objekte aus der Liste curRegion gelesen werden, die Objekte, bei denen die Stadt gleich einer Stadt im Array CitySize ist, der Liste hinzugefügt, die von der Methode getMailingList() zurückgegeben wird.

@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 Unterschiede zwischen den verschiedenen Versionen der Methode getMailingList() wären deutlicher, wenn diese Methode so definiert wäre, dass ein Objekt List<Map<String,Object>> zurückgegeben wird.

Die erste Version würde in jedem Objekt Map erzeugt, das String-Schlüssel mit den Werten custid, name, addressl1, city und storeregion enthält.

Die zweite Version würde in jedem Objekt Map erzeugt, das String-Schlüssel mit den Werten this, custid, name, addressl1, city und storeregion enthält.

Die dritte Version würde in jedem Objekt Map erzeugt, das einen String-Schlüssel mit dem Wert this enthält.


Feedback