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 );
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()); }
name Bob emp 1001 name Dave emp 298003 ...
} 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() ) ;