Dans cet exemple, la collection est un objet java.util.List et est une implémentation de l'interface java.lang.Iterable. Si vous renvoyez une liste d'objets Customer matérialisée, vous pouvez poser plusieurs questions concernant ces données sans avoir à accéder à nouveau à la source de données connectée.
Supposez par exemple que vous souhaitiez savoir combien de clients se trouvent dans la zone de vente de la baie de San Francisco Bay. Votre code peut se présenter comme suit :
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
Le code exécute les étapes suivantes :
Au lieu de fermer qocdata, vous pouvez effectuer une analyse supplémentaire des clients comme indiqué dans l'exemple suivant.
Pour un rapport de gestion, supposez que vous avez besoin de connaître le nombre de villes distinctes situées dans la zone de vente de la baie de San Francisco et les cinq plus grandes villes (en termes de nombre d'adresses) de cette région. Après le feu vert du département gestion, une campagne de mailing cible les clients dans ces cilles.
Vous pouvez utiliser une seule requête sur une source de données connectée et un petit nombre de logiques d'application utilisant les méthodes annotées pour lancer trois requêtes sur les collections.
Vous avez d'abord besoin d'une classe de transfert, utilisée à la fois par l'application d'appel et par les méthodes annotées :
public class CitySize {
public String city;
public Integer size;
}
Comme vous ne pouvez pas utiliser les méthodes d'une classe d'implémentation pour les requêtes sur les collections et les requêtes sur les bases de données, vous devez créer deux interfaces distinctes.
L'interface CustomerQuery définit la méthode de requête sur la source de données. La méthode getCustomersInRegion() renvoie une liste d'objets client représentant les clients se trouvant dans une zone de vente définie.
import com.company.Customer;
public interface CustomerQuery
{
@Select(sql=
"SELECT custId, name, ... FROM Customer WHERE region=?1")
List<Customer> getCustomersInRegion(int r);
}
L'interface RegionReport définit les méthodes de requête sur l'objet collection.
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);
}
Après avoir généré les classes d'implementation pour les interfaces, vous pouvez établir le rapport à la gestion et la liste de clients ciblés avec une logique d'application se présentant comme suit :
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
Le code exécute les étapes suivantes :
Il est important d'indiquer que si la gestion détermine que le mailing cible est trop petit ou trop important, il vous suffit d'apporter une petite modification à la taille allouée au tableau CitySize et à sa boucle pour ajouter ou supprimer les objets Customer de l'éventuelle liste mailingCust. La méthode getMailingList() ne dépend pas de la taille de son tableau d'entrées.