示例:将本地接口用于动态查询

使用本地接口运行动态 Enterprise JavaBeans (EJB) 查询时,您是在 QueryLocal 接口上调用 executeQuery 方法。此接口不会为该方法发起一个事务;因此,您必须显式建立一个事务上下文供查询运行。

注: 要建立一个事务上下文,以下示例调用了 begin() 和 commit() 方法。使用这些方法的另一个替代方法是,您只要将查询代码嵌入事务上下文中运行的 EJB 方法即可。

查询代码用以下导入语句作为开头:

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 资源。否则只有内存中累积了完整的结果集或事务结束时,才会释放这些资源。


指示主题类型的图标 参考主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=xque_localclient
文件名:xque_localclient.html