Beispiel: Ferne Schnittstelle für dynamische Abfrage verwenden
Bei der Ausführung einer dynamischen EJB-Abfrage (Enterprise JavaBeans) über die ferne Schnittstelle wird die Methode "executeQuery" in der Schnittstelle "Query" aufgerufen. Die Methode "executeQuery" hat für diese Schnittstelle das Transaktionsattribut REQUIRED. Deshalb muss nicht explizit ein Transaktionskontext für die Abfrage erstellt werden.
Beginnen Sie mit den folgenden Importanweisungen:
import com.ibm.websphere.ejbquery.QueryHome; import com.ibm.websphere.ejbquery.Query; import com.ibm.websphere.ejbquery.QueryIterator; import com.ibm.websphere.ejbquery.IQueryTuple; import com.ibm.websphere.ejbquery.QueryException;
Schreiben Sie anschließend Ihre Abfrageanweisung in Form einer Zeichenfolge. Das folgende Beispiel ruft beispielsweise die Namen und EJB-Referenzen für unterbezahlte Mitarbeiter auf:
String query = "select e.name as name , object(e) as emp from EmpBean e where e.salary < 50000";
Erstellen Sie ein Query-Objekt, indem Sie eine Referenz von der Klasse QueryHome anfordern. (Diese Klasse definiert die Methode executeQuery.) Zur Vereinfachung verwendet das folgende Beispiel den JNDI-Namen für dynamische Abfragen für das Query-Objekt:
InitialContext ic = new InitialContext(); Object obj = ic.lookup("com/ibm/websphere/ejbquery/Query"); QueryHome qh = ( QueryHome) javax.rmi.PortableRemoteObject.narrow( obj, QueryHome.class ); Query qb = qh.create();
Anschließend müssen Sie die maximale Größe für die Abfrageergebnismenge festlegen, die in dem in der Klasse "QueryIterator" enthaltenen Objekt "QueryIterator" definiert ist. Anschließend müssen Sie die maximale Größe für die Abfrageergebnismenge festlegen, die in dem im API-Paket "QueryIterator" enthaltenen Objekt "QueryIterator" definiert ist. Dieses Beispiel setzt die maximale Größe für das Abfrageergebnis auf 99:
QueryIterator it = qb.executeQuery(query, null, null ,0, 99 );
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) ); Emp e = ( Emp) javax.rmi.PortableRemoteObject.narrow( tuple.getObject(2), Emp.class ); System.out.println( e.getPrimaryKey().toString()); }
name Bob emp 1001 name Dave emp 298003 ...
} catch (QueryException qe) { System.out.println("Query Exception "+ qe.getMessage() ); }
Verarbeitung umfangreicher Ergebnismengen für Abfragen mit der fernen Schnittstelle
Wenn Ihre Abfrage umfangreiche Ergebnismengen zurückgegeben soll, können Sie die Abfrage so programmieren, dass die Ergebnisse in mehreren kleineren, besser verwaltbaren Einheiten zurückgegeben werden. Verwenden Sie die Parameter "skipRow" und "maxRow" der fernen Methode "executeQuery", um die Antwort in Blöcken abzurufen. Beispiele:
int skipRow=0; int maxRow=100; QueryIterator it = null; do { it = qb.executeQuery(query, null, null ,skipRow, maxRow ); while (it.hasNext()) { // Ergebnis anzeigen skipRow = skipRow + maxRow; } } while ( ! it.isComplete() ) ;