API de consulta dinámica: métodos prepareQuery() y executePlan()
Utilice estos métodos para asignar de forma más eficiente la sobrecarga asociada con una consulta dinámica. Son equivalentes, en cuanto a funcionamiento, a los métodos prepareStatement() y executeQuery() de la API JDBC.
Para realizar una consulta EJB (Enterprise JavaBeans) dinámica, el servidor de aplicaciones debe analizar la serie de consulta en lenguaje de consulta estructurado (SQL) durante la ejecución. Evidentemente, puede eliminar la sobrecarga de ejecución si opta por realizar una consulta EJB estándar en lugar de realizar una consulta dinámica. Las consultas estándar, conocidas también como consultas de despliegue se analizan y se crean durante el despliegue, y luego se ejecutan mediante un método de búsqueda o de selección.
Otra opción consiste en escribir código que redistribuya la sobrecarga de la consulta dinámica para obtener un mejor rendimiento de la aplicación. Empiece llamando el método prepareQuery() en lugar de llamar el método executeQuery(). El método prepareQuery() analiza y convierte la consulta, y devuelve una cadena denominada plan de consulta. El plan contiene la sentencia SQL que se produce en el análisis y la conversión, así como otra información necesaria para la API de consulta dinámica. Guarde esta cadena en la aplicación y llame al método executePlan() con la cadena para ejecutar la consulta. (Si lo desea, también puede utilizar el método prepareQuery() simplemente para ver el producto de traducción SQL; simplemente debe llamar al método y visualizar el valor de retorno).
Pase los parámetros de la consulta como matriz de tipo Object a las llamadas de método prepareQuery() y executePlan(). Asegúrese de que pasa los tipos de datos apropiados, ya que el servidor de aplicaciones valida la consulta de acuerdo con el tipo de parámetro (en lugar de los valores reales) cuando procesa la llamada al método prepareQuery().
Código de ejemplo
select e.name as name, object(e) as emp from EmpBean e where e.salary < 50000
La segunda
llamada devuelve una consulta que es funcionalmente equivalente a esta sentencia:
select e.name as name, object(e) as emp from EmpBean e where e.salary < 60000
El ejemplo:
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);
En la llamada a prepareQuery(), pasar cualquier valor entero. De este modo se define ?1 como tipo entero, como en el caso siguiente:
String queryPlan= qb.prepareQuery(query, parms, null );
parms[0] = new Integer(50000);
A continuación, ejecute la consulta con un valor real Integer(50000) para ?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);
Ejecute la consulta de nuevo con un valor distinto de Integer(60000) para ?1:
it = qb.executePlan( queryPlan, parms, 0, 99);