API de requête dynamique : méthodes prepareQuery() et executePlan()
Ces méthodes permettent d'allouer efficacement la surcharge associée à une requête dynamique. Elles sont équivalentes dans leur fonctionnement aux méthodes prepareStatement() et executeQuery() de l'API JDBC.
Pour effectuer une requête EJB (Enterprise JavaBeans) dynamique, le serveur d'applications doit analyser la chaîne de la requête et la convertir en langage SQL (Structured Query Language) lors de l'exécution. Vous pouvez évidemment éliminer la surcharge d'exécution en choisissant d'effectuer une requête EJB standard à la place d'une requête dynamique. Parfois appelées requêtes de déploiement, les requêtes standard sont analysées et compilées lors du déploiement, puis exécutées par une méthode finder ou select.
Une autre option consiste à rédiger un de redistribution de la surcharge de requête dynamique pour améliorer les performances de l'application. Appelez la méthode prepareQuery() à la place de la méthode executeQuery(). La méthode prepareQuery() analyse et convertit la requête, puis renvoie une chaîne appelée plan de requête. Ce plan contient l'instruction SQL générée par l'analyse et la conversion, ainsi que d'autres informations requises par l'API de requête dynamique. Sauvegardez cette chaîne dans l'application et appelez la méthode executePlan() avec la chaîne pour exécuter la requête (vous pouvez également utiliser la méthode prepareQuery() pour consulter le produit de conversion en SQL ; il suffit de l'appeler et d'afficher la valeur renvoyée).
Transmettez les paramètres de la requête sous forme de tableau de type Object sur les appels des méthodes prepareQuery() et executePlan(). Vérifiez que vous transmettez les types de données appropriés, car le serveur d'applications valide la requête en fonction du type de paramètre (et non en fonction des valeurs réelles) lorsqu'il traite l'appel de méthode prepareQuery().
Exemple de code
select e.name as name, object(e) as emp from EmpBean e where e.salary < 50000
Le
second appel exécute une requête fonctionnellement équivalente à
l'instruction suivante :select e.name as name, object(e) as emp from EmpBean e where e.salary < 60000
Exemple :
String query =
select e.name as name , object(e) as emp from EmpBean e where e.salary < ?1;
QueryIterator it = null;
Integer[] parms = new Integer[1];
parms[0] = new Integer(0);
Dans l'appel de prepareQuery(), indiquez n'importe quelle valeur entière (Integer). ?1 est ainsi défini comme type Integer, comme dans l'exemple qui suit :
String queryPlan= qb.prepareQuery(query, parms, null );
parms[0] = new Integer(50000);
Exécutez ensuite la requête avec une valeur réelle Integer(50000) à la place de ?1 :
select e.name as name, object(e) as emp from EmpBean e where e.salary < 50000it =
qb.executePlan( queryPlan, parms, 0, 99);
parms[0] = new Integer(60000);
Exécutez à nouveau la requête avec une valeur différente Integer(60000) à la place de ?1 :
it = qb.executePlan( queryPlan, parms, 0, 99);