Rückgabetyp für integrierte Methoden zum Abfragen von Datenbanken: erste Zeile eines Abfrageergebnisses

Sie können die überladene Methode queryFirst() der Schnittstelle Data verwenden, um nur die erste Zeile in einem Abfrageergebnis zurückzugeben.
Diese Methode könnten Sie in den folgenden Situationen verwenden:

Wenn pureQuery ermittelt, dass nur eine Zeile zurückgegeben werden soll, kann gewählt werden, dass die Abfrage optimiert wird, indem die Klausel FETCH FIRST ROW ONLY hinzugefügt oder die Anweisung SELECT in eine Anweisung SELECT-INTO geändert wird.

Die verschiedenen Formen der Methode queryFirst()

Die Schnittstelle Data stellt drei Formen der Methode queryFirst() bereit.

java.util.Map <java.lang.String, java.lang.Object> queryFirst(java.lang.String sql, java.lang.Object... parameters)
Diese Form der Methode queryFirst() gibt ein Ergebnis des Typs java.util.Map<String,Object> zurück. String ist der Name einer Spalte oder eines Ausdrucks in der angegebenen Abfrage in Kleinbuchstaben. Die Klasse des zugeordneten Object variiert je nach dem Datentyp einer Spalte oder eines Ausdrucks. Sie ist eine Instanz der Klasse, die von JDBC als natürliche Klasse zum Speichern von Instanzen des Datentyps der Spalte oder des Ausdrucks definiert wird.
Angenommen, Sie benötigen die durchschnittliche Anzahl Jahre Schulbildung (EDLEVEL) für eine einzelne Abteilung (WORKDEPT), sofern diese Abteilung mehr als drei Mitarbeiter umfasst.

Folgender Code erstellt ein einzelnes Map mit den Schlüsseln average_edlevel und workdept. Der Code übergibt den Wert REPORTDEPT, um die relevante Abteilung zu identifizieren.

Connection con = DriverManager.getConnection(...); 
Data db = DataFactory.getData(con); 
String reportDept = "B01"; 
Map<String, Object> edLevelReport = db.queryFirst(  "SELECT AVG(EDLEVEL) AS AVERAGE_EDLEVEL, WORKDEPT" +  
" FROM SAMPLE_SCHEMA.EMP WHERE WORKDEPT = ?" +  " GROUP BY WORKDEPT HAVING COUNT(*) > 3", reportDept );

Statt eines Map könnte auch eine der beiden Formen der Methode queryFirst() verwendet werden, die jeweils eine Instanz einer vorhandenen Klasse zurückgibt.

Die Rückgabe der Informationen in einer Klasse com.company.Employee könnte beispielsweise ausreichend sein. Diese Bean hat Eigenschaften, die in der Lage sind, die zwei Informationselemente zu speichern, an denen Sie interessiert sind. Es ist jedoch nicht empfehlenswert, eine Bean 'Employee' zu füllen, wenn Sie nicht die Werte aller Eigenschaften der Bean bereitstellen wollen.

Stattdessen könnten Sie ein neues Java-Objekt definieren, möglicherweise als private Klasse, das in der Lage ist, exakt die benötigten Informationen zu speichern. In vielen Situationen ist dies möglicherweise die beste Lösung, weil dadurch selbsterklärender, klarer Code bereitgestellt wird. Diese Lösung erfordert jedoch eine zusätzliche Anwendungslogik zur Verarbeitung einer Instanz dieser neuen Klasse, beispielsweise durch Eingabe ihres Inhalts in ein Arbeitsblatt oder durch Senden ihres Inhalts an ein XML-Dokument.

public T queryFirst (java.lang.String sql, Class returnClass, Object... parameters)
Bei der zweiten Form der Methode queryFirst() werden generische Elemente für die Rückgabe eines Ergebnisses des Typs <T> verwendet.
Angenommen, Sie benötigen eine Instanz einer Bean 'Employee' für den Mitarbeiter, dessen Personalnummer (EMPNO) '000070' lautet. Die Definition der Bean 'Employee' könnte wie folgt aussehen:
public Employee { 
@Column(name="EMPNO")  
public String employeeId; 
@Column(name = "FIRSTNME")  
public String firstName; 
@Column(name = "MIDINIT")  
public String middleInitial; 
public String lastName; 
@Column(name = "WORKDEPT")  
public String departmentId; 
@Column(name = "PHONENO")  
public String extension; 
public Date hireDate;   }
Die Spalte EMPNO ist der Primärschlüssel der Tabelle EMPLOYEE. Wenn die Klausel WHERE der Abfrage diese Spalte enthält, kann von der Methode nur ein Objekt Employee zurückgegeben werden. Ihr Code könnte wie folgt aussehen:
Connection con = DriverManager.getConnection(...); 
Data db = DataFactory.getData(con); 
String managerEmp = "000070"; 
com.company.Employee empData = db.queryFirst(   "SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, WORKDEPT," +
     " PHONENO, HIREDATE FROM HRDept.Employee" +
     " WHERE EMPNO = ?", Employee.class, managerEmp );
public T queryFirst (java.lang.String sql, RowHandler singleRowHandler, Object... parameters)
Bei der dritten Form der Methode queryFirst() wird ebenfalls ein Ergebnis des Typs <T> zurückgegeben.
Angenommen, Sie benötigen Informationen zu einem Mitarbeiter, pureQuery ist jedoch nicht in der Lage, die Ergebnisse Ihrer Abfrage automatisch den Eigenschaften der Bean 'Employee' zuzuordnen. In diesem Fall könnten Sie einen RowHandler schreiben, um diese Zuordnung vorzunehmen.

Feedback