动态查询 API:prepareQuery() 和 executePlan() 方法
使用这些方法可以更有效地分配与动态查询关联的开销。它们在功能上相当于 JDBC API 的 prepareStatement() 和 executeQuery() 方法。
要执行动态 Enterprise JavaBeans (EJB) 查询,应用程序服务器必须在运行时将查询字符串解析为结构化查询语言 (SQL)。当然,您可以通过选择执行标准 EJB 查询而不是动态查询来避免运行时开销。标准查询有时被称为部署查询,在部署时解析和构建它们,然后由 finder 或 select 方法执行。
您还可以选择编写代码,此代码将再分发动态查询开销以实现更高的应用程序性能。首先调用 prepareQuery() 方法,以它取代 executeQuery() 方法。prepareQuery() 方法将对查询进行解析和转换,返回一个名为 query plan 的字符串。该计划包含解析和转换操作生成的 SQL 语句以及动态查询 API 所需的其他信息。将这个字符串保存在您的应用程序中并对字符串调用 executePlan() 方法以运行查询。(您可能只希望使用 prepareQuery() 方法来查看 SQL 转换结果;只需调用此方法即可显示返回值。)
在 prepareQuery() 和 executePlan() 方法调用中,将查询的参数作为一组 Object 类型传递。确保您传递了适当的数据类型,因为当应用程序服务器处理 prepareQuery() 方法调用时,它将根据参数类型(而不是实际值)对查询进行验证。
示例代码
select e.name as name, object(e) as emp from EmpBean e where e.salary < 50000
第二个调用运行的查询在功能上相当于这个语句:
select e.name as name, object(e) as emp from EmpBean e where e.salary < 60000
示例:
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);
在调用 prepareQuery() 时,传递任何整数值。这样将把 ?1 定义为 Integer 类型,如下所示:
String queryPlan= qb.prepareQuery(query, parms, null );
parms[0] = new Integer(50000);
接着,您以实际值 Integer(50000) 为 ?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);
以一个不同的值 Integer(60000) 为 ?1 再次运行查询:
it = qb.executePlan( queryPlan, parms, 0, 99);