Ejemplo: Utilización de la interfaz remota para la consulta dinámica
Al ejecutar una consulta dinámica EJB (Enterprise JavaBeans) mediante la interfaz remota, se llama al método executeQuery de la interfaz Query. El método executeQuery tiene un atributo de transacción de REQUIRED para esta interfaz; por tanto, no es necesario establecer explícitamente un contexto de transacción para poder ejecutar la consulta.
Empiece con las sentencias de importación siguientes:
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;
A continuación, escriba la sentencia de consulta como una serie, como en el ejemplo siguiente que recupera los nombres y las referencias EJB para empleados con un sueldo bajo:
String query = "select e.name as name , object(e) as emp from EmpBean e where e.salary < 50000";
Cree un objeto Query obteniendo una referencia de la clase QueryHome (esta clase define el método executeQuery method). Tenga en cuenta que por motivos de simplicidad, en el ejemplo siguiente se utiliza el nombre JNDI de la consulta dinámica para el objeto 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();
A continuación, especifique un tamaño máximo para el conjunto de resultados de la consulta, que se define en el objeto QueryIterator. A continuación, debe especificar un tamaño máximo para el conjunto de resultados de la consulta, que se define en el objeto QueryIterator que se incluye en el paquete de la API QueryIterator. Este ejemplo establece el tamaño máximo del conjunto de resultados en 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() ); }
Manejo de grandes recopilaciones de resultados para la consulta de la interfaz remota
Si quiere que la consulta devuelva una gran recopilación de resultados, tiene la opción de programarla para que devuelva resultados en múltiplos más pequeños, en cantidades más manejables. Utilice los parámetros skipRow y maxRow en el método remoto executeQuery para recuperar la respuesta en chunks. Por ejemplo:
int skipRow=0; int maxRow=100; QueryIterator it = null; do { it = qb.executeQuery(query, null, null ,skipRow, maxRow ); while (it.hasNext() ) { // display result skipRow = skipRow + maxRow; } } while ( ! it.isComplete() ) ;