Exemple : Utilisation de l'interface distante pour la requête dynamique

Lorsque vous exécutez une requête EJB (Enterprise JavaBeans) dynamique via l'interface distante, vous appelez la méthode executeQuery sur l'interface Query. La méthode executeQuery est dotée de l'attribut de transaction REQUIRED pour cette interface ; il n'est donc pas nécessaire d'établir de manière explicite un contexte de transaction pour l'exécution de la requête.

Commencez par les instructions d'importation suivantes :

import com.ibm.websphere.ejbquery.QueryHome;
import com.ibm.websphere.ejbquery.Query;
import com.ibm.websphere.ejbquery.QueryIterator;
import com.ibm.websphere.ejbquery.IQueryTuple;
import com.ibm.websphere.ejbquery.QueryException;

Rédigez ensuite les instructions de requête sous forme d'une chaîne, comme dans l'exemple suivant qui permet d'extraire les noms et les références d'EJB de salariés sous-payés :

String query = 
"select e.name as name , object(e) as emp from EmpBean e where e.salary < 50000"; 

Créez un objet Query à l'aide d'une référence issue de la classe QueryHome (cette classe définit la méthode executeQuery). A noter que dans un souci de simplicité, l'exemple qui suit emploie le nom JNDI de la requête dynamique pour l'objet Query :

InitialContext ic =  new InitialContext(); 

Object obj =  ic.lookup("com/ibm/websphere/ejbquery/Query");

QueryHome  qh = 
 ( QueryHome) javax.rmi.PortableRemoteObject.narrow( obj, QueryHome.class );
Query qb = qh.create();

Vous devez ensuite préciser une taille maximale de l'ensemble de résultats de la requête, définie dans l'objet QueryIterator, qui est inclus dans la classe QueryIterator. Cette classe est comprise dans le package de l'API QueryIterator. Cet exemple définit une taille maximale de l'ensemble de résultats de 99 :

QueryIterator it = qb.executeQuery(query, null, null ,0, 99 );
L'itérateur contient une collection d'objets IQueryTuple, qui sont des enregistrements des valeurs de collection renvoyées Selon les critères de l'instruction de requête de cet exemple, chaque nuplet de ce scénario contient une valeur name et une valeur object(e). Pour afficher le contenu des résultats de la requête, utilisez le code suivant :
while (it.hasNext() ) { 
	IQueryTuple tuple = (IQueryTuple) it.next();
	System.out.print( it.getFieldName(1) );
	String s = (String) tuple.getObject(1);
	System.out.println( s);
	System.out.println( it.getFieldName(2) );
	Emp e = ( Emp) javax.rmi.PortableRemoteObject.narrow( tuple.getObject(2), Emp.class );
	System.out.println( e.getPrimaryKey().toString());
}
Ce programme peut générer une sortie similaire à celle présentée ci-dessous :
name Bob 
emp 1001
name Dave
emp 298003
...
Il convient pour terminer, d'intercepter et de traiter les exceptions éventuelles. Une exception peut être générée si la syntaxe d'une instruction de requête est erronée ou si une erreur se produit lors de l'exécution d'un traitement. L'exemple suivant intercepte et traite ces exceptions :
} catch (QueryException qe) {
    System.out.println("Query Exception "+ qe.getMessage() );
}

Gestion des collections importantes de résultats de la requête de l'interface distante

Si vous prévoyez que la requête renvoie une collection de taille significative, vous pouvez la programmer de sorte qu'elle renvoie les résultats sous forme de plusieurs quantités plus petites, plus facilement gérables. Utilisez les paramètres skipRow et maxRow sur la méthode distante executeQuery pour extraire la réponse en la fractionnant. Exemple :

int skipRow=0;
int maxRow=100;
QueryIterator it = null;
do {
	it = qb.executeQuery(query, null, null ,skipRow, maxRow );
	while (it.hasNext() ) { 
	//afficher le résultat 
	skipRow = skipRow + maxRow;
}
} while ( ! it.isComplete() ) ;

Icône indiquant le type de rubrique Rubrique de référence



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=xque_remoteclient
Nom du fichier : xque_remoteclient.html