Ejemplo: Utilización de la interfaz local para la consulta dinámica
Al ejecutar una consulta dinámica EJB (Enterprise JavaBeans) mediante la interfaz local, se llama al método executeQuery de la interfaz QueryLocal. Esta interfaz no inicia una transacción para el método; por tanto, debe establecer explícitamente un contexto de transacción para poder ejecutar la consulta.
Inicie el código de consulta con las sentencias de importación siguientes:
import com.ibm.websphere.ejbquery.QueryLocalHome; import com.ibm.websphere.ejbquery.QueryLocal; import com.ibm.websphere.ejbquery.QueryLocalIterator; 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, object(e) from EmpBean e where e.salary < 50000 ";
Cree un objeto QueryLocal obteniendo una referencia de la clase QueryLocalHome (esta clase define el método executeQuery method). Tenga en cuenta que en el ejemplo siguiente, ejb/query se utiliza como referencia local EJB que apunta al nombre JNDI de la consulta dinámica (com/ibm/websphere/ejbquery/Query):
InitialContext ic = new InitialContext(); QueryLocalHome qh = ( LocalQueryHome) ic.lookup( "java:comp/env/ejb/query" ); QueryLocal qb = qh.create();
La última porción de código inicia una transacción, llama al método executeQuery y visualiza los resultados de la consulta. Se crea una instancia de la clase QueryLocalIterator porque define el conjunto de resultados de la consulta Esta clase se incluye en el paquete de la API en la clase QueryIterator. Recuerde que el iterador pierde validez al final de la transacción; debe utilizar el iterador en el mismo ámbito de transacción que la llamada executeQuery.
userTransaction.begin(); QueryLocalIterator it = qb.executeQuery(query, null, null); 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) ); EmpLocal e = ( EmpLocal ) tuple.getObject(2); System.out.println( e.getPrimaryKey().toString()); } userTransaction.commit();
En la mayoría de las situaciones, el objeto QueryLocalIterator es gestionado por demanda. Es decir, provoca que los datos se devuelvan en incrementos: para cada recuperación de registro de la base de datos, debe llamarse al método next() en el iterador (pueden existir situaciones en las que el iterador no sea gestionado por demanda. Para obtener más información, consulte la subsección "Interfaces de consulta local" del tema Consideraciones sobre el rendimiento de las consultas dinámicas.)
Dado que la totalidad del conjunto de resultados de la consulta se materializa en incrementos en la memoria del servidor de aplicaciones, puede controlar su tamaño fácilmente. Durante una ejecución de prueba, por ejemplo, puede decidir que sólo se devuelvan unas cuantas tuplas del conjunto de resultados si es necesario. En ese caso, debe utilizar una llamada del método close() en el objeto QueryLocalIterator para cerrar el bucle de la consulta. De este modo se liberan recursos SQL utilizados por el iterador. De lo contrario, estos recursos no se liberan hasta que la totalidad del conjunto de resultados se acumula en la memoria o cuando termina la transacción.