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 );
Der Iterator enthält eine Sammlung von IQueryTuple-Objekten, die Datensätze der zurückgegebenen Objektgruppenwerte sind. Den Kriterien der Beispielabfrageanweisung entsprechend, enthält jedes Tupel in diesem Szenario einen Wert name und einen Wert object(e). Verwenden Sie zum Anzeigen des Inhalts des Abfrageergebnisses folgenden Code:
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());
}
Die Ausgabe des Programms könnte wie folgt aussehen:
name Bob 
emp 1001
name Dave
emp 298003
...
Abschließend müssen alle Ausnahmen abgefangen und behandelt werden. Eine Ausnahme kann eintreten, wenn eine Abfrageanweisung einen Syntaxfehler enthält oder wenn zur Laufzeit ein Verarbeitungsfehler auftritt. Das folgende Beispiel fängt diese Ausnahmen ab und behandelt sie:
} 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() ) ;

Symbol, das den Typ des Artikels anzeigt. Referenzartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=xque_remoteclient
Dateiname:xque_remoteclient.html