Type de renvoi pour les méthodes intégrées interrogeant les bases de données : première ligne d'un résultat de requête

Vous pouvez utiliser la méthode surchargée queryFirst() de l'interface Data pour renvoyer uniquement la première ligne du résultat d'une requête.
Vous pouvez souhaiter utiliser cette méthode dans les situations suivantes :

Si pureQuery détermine qu'une seule ligne doit être retournée, il peut choisir d'optimiser la requête en ajoutant la clause FETCH FIRST ROW ONLY ou en modifiant l'instruction SELECT et en la remplaçant par une instruction SELECT-INTO.

Les différentes formes de la méthode queryFirst()

L'interface Data fournit trois formes de la méthode queryFirst().

java.util.Map <java.lang.String, java.lang.Object> queryFirst(java.lang.String sql, java.lang.Object... parameters)
Cette forme de la méthode queryFirst() renvoie un résultat du type java.util.Map<String,Object>. String est le nom en minuscules d'une colonne ou d'une expression dans la requête donnée. La classe de l'Object associé varie en fonction du type de données d'une colonne ou d'une expression. Il s'agit d'une instance de la classe définie par JDBC comme la classe naturelle pour stocker des instances du type de données de la colonne ou de l'expression.
Par exemple, supposons que vous ayez besoin du nombre moyen d'années de formation (EDLEVEL) des employés d'un seul département (WORKDEPT), à condition que ce département compte plus de trois employés.

Le code suivant produit une mappe unique contenant des clés average_edlevel et workdept. Le code transmet la valeur de REPORTDEPT pour identifier le département concerné.

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 );

Au lieu d'une mappe, on pourrait utiliser l'une des deux autres formes de la méthode queryFirst(), chacune renvoyant une instance d'une classe existante.

Par exemple, le renvoi des informations d'une classe com.company.Employee peut être suffisant. Ce bean possède des propriétés pouvant stocker les deux éléments d'information qui vous intéressent. Toutefois, il n'est pas conseillé de remplir un bean Employee si vous n'avez pas l'intention de fournir les valeurs de toutes les propriétés du bean

Vous pourriez également définir un nouvel objet Java, éventuellement en tant que classe privée, capable de stocker exactement les informations nécessaires. Dans de nombreuses situations, il peut s'agir de la meilleure solution car elle fournit un code clair qui se documente lui-même. Toutefois, cette solution nécessiterait une logique d'application supplémentaire pour traiter une instance de cette nouvelle classe, par exemple en saisissant son contenu dans feuille de calcul ou en envoyant le contenu vers un document XML.

public T queryFirst (java.lang.String sql, Class returnClass, Object... parameters)
La deuxième forme de la méthode queryFirst() utilise des caractères génériques pour renvoyer un résultat du type <T>.
Par exemple, vous pouvez avoir besoin d'une instance d'un bean Employee pour un employé dont le numéro EMPNO est "000070". La définition du bean Employee peut se présenter ainsi :
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")  
opublic String departmentId; 
@Column(name = "PHONENO")  
public String extension; 
public Date hireDate;   }
La colonne EMPNO est la clé primaire de la table EMPLOYEE. Si la clause WHERE de votre requête contient cette colonne, la méthode peut renvoyer un seul objet Employee. Votre code peut se présenter ainsi :
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)
La troisième forme de la méthode queryFirst() renvoie également un résultat du type <T>.
Par exemple, vous pouvez avoir besoin d'informations à propos d'un employé, mais pureQuery peut ne pas être en mesure de mapper automatiquement les résultats de votre requête aux propriétés du bean Employee. Vous pourriez écrire un RowHandler pour réaliser ce mappage.

Commentaires