WebSphere eXtreme Scale est fourni avec l'API de requête EntityManager.
L'API de requête EntityManager est très semblable aux autres moteurs de requête SQL qui exécutent des requêtes sur des objets. Une requête est définie, puis le résultat est extrait de la requête à l'aide de diverses méthodes getResult.
Les exemples suivants font référence aux entités utilisées dans le tutoriel EntityManager de la Présentation du produit.
Dans cet exemple, vous recherchez les clients dont le nom de famille est Claus :
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();
Comme vous recherchez tous les clients dont le nom de famille est Claus, vous utilisez un paramètre destiné à définir le nom de famille, car vous souhaiterez peut-être réutiliser cette requête.
Exemple de paramètre positionnel
Query q = em.createQuery("select c from Customer c where c.surname=?1");
q.setParameter(1, "Claus");
L'utilisation de paramètres est très importante lorsqu'une requête est utilisée plusieurs fois. EntityManager doit analyser la chaîne de requête et générer un plan pour la requête, ce qui consomme une grande quantité de ressources. L'utilisation d'un paramètre permet à EntityManager de mettre en cache le plan de la requête et de réduire le temps nécessaire à son exécution.
Des paramètres positionnels et des paramètres de nom sont utilisés :
Exemple de paramètre de nom
Query q = em.createQuery("select c from Customer c where c.surname=:name");
q.setParameter("name", "Claus");
Si vous avez des millions de clients, la requête précédente doit analyser toutes les lignes de la mappe Customer. Cette opération risque de ne pas être efficace. C'est pourquoi eXtreme Scale propose un mécanisme permettant de définir des index pour les attributs contenus dans une entité. Lorsque c'est nécessaire, la requête utilise automatiquement cet index, ce qui permet d'accélérer considérablement son traitement.
Pour définir les attributs à indexer, il vous suffit d'utiliser l'annotation @Index sur l'attribut d'entité :
@Entity
public class Customer
{
@Id String id;
String firstName;
@Index String surname;
String address;
String phoneNumber;
}
EntityManager crée un index ObjectGrid approprié pour l'attribut du nom de famille dans l'entité Customer et le moteur de requête utilise automatiquement l'index, ce qui réduit fortement la durée de la requête.
Si un million de clients se nomment Claus, il est peu probable que vous souhaitiez afficher une page les contenant tous. Vous souhaiterez sans doute afficher 10 ou 25 clients à la fois.
Les méthodes Query setFirstResult et setMaxResults sont utiles car elle renvoient uniquement un sous-ensemble de résultats.
Exemple de pagination
Query q = em.createQuery("select c from Customer c where c.surname=:name");
q.setParameter("name", "Claus");
// Display the first page
q.setFirstResult=1;
q.setMaxResults=25;
displayPage(q.getResultIterator());
// Display the second page
q.setFirstResult=26;
displayPage(q.getResultIterator());