示例:将本地接口用于动态查询
使用本地接口运行动态 Enterprise JavaBeans (EJB) 查询时,您是在 QueryLocal 接口上调用 executeQuery 方法。此接口不会为该方法发起一个事务;因此,您必须显式建立一个事务上下文供查询运行。
查询代码用以下导入语句作为开头:
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;
接着,以字符串形式编写您的查询语句,如以下示例所示(该示例检索未付足工资员工的姓名和 EJB 引用):
String query = "select e.name, object(e) from EmpBean e where e.salary < 50000 ";
通过从 QueryLocalHome 类获取一个引用创建一个 QueryLocal 对象。(这个类定义了 executeQuery 方法。)请注意,在以下示例中,ejb/query 用作一个指向动态查询 JNDI 名称(com/ibm/websphere/ejbquery/Query)的本地 EJB 引用:
InitialContext ic = new InitialContext(); QueryLocalHome qh = ( LocalQueryHome) ic.lookup( "java:comp/env/ejb/query" ); QueryLocal qb = qh.create();
代码的最后一部分发起一个事务,调用 executeQuery 方法并显示查询结果。将对 QueryLocalIterator 类进行实例化,因为它定义了查询结果集。这个类包含在 Class QueryIterator API 包中。请记住,迭代器将在事务结束时失效;您必须在 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();
在多数情况下,QueryLocalIterator 对象是需求驱动的。即,它导致数据呈增量返回:对于每个数据库记录检索,必须在迭代器上调用 next() 方法。(某些情况下,迭代器也可以不是需求驱动的。有关更多信息,请查阅动态查询性能注意事项主题中的“本地查询界面”部分。)
因为应用程序服务器内存中的完整查询结果集将呈增量具体化,所以您可以轻松控制它的大小。例如,在测试运行中,您可以决定只需返回几组查询结果。在这种情况下,您应该在 QueryLocalIterator 对象上使用 close() 方法的一个调用来结束查询循环。这样做可以释放迭代器使用的 SQL 资源。否则只有内存中累积了完整的结果集或事务结束时,才会释放这些资源。