Référence aux objets des collections Java intégrées à la mémoire en utilisant "this" dans les instructions SELECT

Dans les instructions SELECT des requêtes lancées sur les collections intégrées à la mémoire, vous pouvez utiliser "this" pour faire référence aux objets des collections.
Il est utile de pouvoir faire référence aux objets des collections avec "this" pour deux raisons :

Comment "this" fonctionne ?

Pour chaque collection, les objets contenus dans la collection deviennent effectivement le contenu d'une colonne appelée ‘this' dans un tableau SQL représentant le contenu de la collection.

pureQuery tient compte de la classe des objets contenus dans la collection pour déterminer les noms des propriétés de ces objets. Les noms des propriétés deviennent les noms des colonnes d'un tableau SQL et les valeurs des propriétés deviennent les valeurs des propriétés de la ligne correspondante du tableau SQL.

Par exemple, prenez la collection List<Customer> appelée customers et cette définition d'un bean client.

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

pureQuery peut représenter le contenu de la collection dans une tableau SQL virtuel comme suit.

Tableau 1. Tableau SQL virtuel de List<Customer> customers
THIS CUSTID NAME ADDRESSL1 CITY REGION
objet 0 Customer 001 Client important 1234 Market Street San Francisco 900
objet 1 Customer 002 Un autre client important 5678 California Street San Francisco 900
objet 2 Customer 003 Encore un autre client important 90 North First Street San Jose 900

Exemple

Supposez que vous ayez besoin d'une méthode annotée pour lancer une requête sur une liste d'objets Customer et pour renvoyer les objets représentant les clients situés dans les cinq plus grandes villes de la zone de vente.

Vous pouvez écrire la méthode comme suit :

@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);
La classe CitySize peut avoir cette définition
public class CitySize {
  public String city;
  public Integer size;
}

Etant donné que les objets Customer sont lus à partir de la liste curRegion, pour les objets qui possèdent une ville identique à la ville apparaissant dans le tableau CitySize, les valeurs de la colonne sélectionnée sont utilisées pour renseigner une nouvelle instance d'un objet Customer et ce nouvel objet est ajouté à la liste renvoyée par la méthode getMailingList().

Vous pouvez également sélectionner toutes les colonnes des objets Customer, comme suit :

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

Etant donné que les instances des objets Customer sont lues à partir de la liste curRegion, pour les objets qui possèdent une ville identique à la ville apparaissant dans le tableau CitySize, toutes les valeurs de la colonne sélectionnée (y compris la colonne "this") sont utilisées pour renseigner une nouvelle instance d'un objet Customer et ce nouvel objet est ajouté à la liste renvoyée par la méthode getMailingList().

Notez que ces deux méthodes créent les nouvelles instances des objets Customer correspondant à la requête. Si vous utilisez "this" dans la liste de l'instruction SELECT et que les objets qui correspondent à la requête sont de l'un des types suivants, vos méthodes créent de nouvelles instances des objets correspondant à leurs requêtes également.
  • Type primitif ou encapsuleur de type primitif
  • byte[]
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp

Dans cet exemple, étant donné que les objets Customer sont lus à partir de la liste curRegion, les objets qui possèdent une ville identique à la ville apparaissant dans le tableau CitySize, sont ajoutés à la liste renvoyée par la méthode getMailingList().

@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);

Les différences entre les différentes versions de la méthode getMailingList() sont visibles si cette méthode est définie pour renvoyer un objet List<Map<String,Object>>.

La première version donne chaque objet Map contenant les clés String avec les valeurs custid, name, addressl1, city et storeregion.

La deuxième version donne chaque objet Map contenant les clés String avec les valeurs this, custid, name, addressl1, city et storeregion.

La troisième version donne chaque objet Map contenant une clé String avec la valeur this.


Commentaires