JDBC ResultSet obtient des colonnes avec un alias de table

Imagine que j’ai une requête comme

SELECT * from table1 a, table2 b where (WHATEVER) 

Peut-être que les deux tables ont le même nom de colonne. Donc, je pense qu’il serait bien d’accéder aux données via

 resultSet.getSsortingng("a.columnName"); resultSet.getSsortingng("b.columnName"); 

Mais cela se retourne contre moi et je ne reçois rien. Je lis l’API, mais ils ne parlent pas vraiment de ce cas. Une telle fonctionnalité dépend-elle du fournisseur?

JDBC nommera simplement les colonnes selon ce qui est spécifié dans la requête – il ne connaît pas les noms de tables, etc.

Vous avez deux options:

Option 1: nommer les colonnes différemment dans la requête, c.-à-d.

 SELECT a.columnName as columnNameA, b.columnName as columnNameB, ... from table1 a, table2 b where (WHATEVER) 

puis, dans votre code Java, reportez-vous aux alias de colonne:

 resultSet.getSsortingng("columnNameA"); resultSet.getSsortingng("columnNameB"); 

Option 2: reportez vous à la colonne dans votre appel à l’API JDBC:

 resultSet.getSsortingng(1); resultSet.getSsortingng(2); 

Notez que l’API JDBC utilise des index à base unique – c’est-à-dire qu’ils comptent à partir de 1 (pas de 0 comme les index Java), utilisez donc 1 pour la première colonne, 2 pour la deuxième colonne, etc.

Je recommanderais l’option 1, car il est plus sûr de faire référence à des colonnes nommées: une personne peut changer l’ordre des colonnes de la requête et casserait votre code en silence (vous accéderiez à la mauvaise colonne mais ne le sauriez pas), mais si modifiez les noms des colonnes, vous obtiendrez au moins une exception “no such column” au moment de l’exécution.

ResultSetMetadata.getColumnLabel () est ce dont vous avez besoin

(edit) exemple d’exemple, comme indiqué par bharal dans le commentaire

 SELECT * from table1 a, table2 b where (WHATEVER) ResultSetMetaData rsmd = rset.getMetaData(); rsmd.getColumnLabel(1); 

Utilisez des alias de colonne comme:

 SELECT A.ID 'A_ID', B.ID 'B_ID' FROM TABLE1 AS A, TABLE2 AS B... 

Et spécifiez toutes les colonnes que vous récupérez (c’est une bonne pratique).

Si vous utilisez MySQL, ajoutez simplement

 &useOldAliasMetadataBehavior=true 

à votre connectionSsortingng.

Ensuite, vous pouvez utiliser ce petit assistant:

 import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; public class ResultSetHelper { private final Map columnMap; public ResultSetHelper(ResultSet rs) throws SQLException { this.columnMap = new HashMap<>(); ResultSetMetaData md = rs.getMetaData(); int columnCount = md.getColumnCount(); for (int index = 1; index <= columnCount; index++) { String columnName = md.getColumnLabel(index); if (!columnMap.containsKey(columnName)) { columnMap.put(columnName, index); } String tableAlias = md.getTableName(index); if (tableAlias != null && !tableAlias.trim().isEmpty()) { columnMap.put(tableAlias + "." + columnName, index); } } } public Integer getColumnIndex(String columnName) { return columnMap.get(columnName); } public Integer getColumnIndex(String tableAlias, String columnName) { return columnMap.get(tableAlias + "." + columnName); } } 

Vous pouvez utiliser un alias au niveau SQL. Ensuite, vous récupérez les données par index. (Mais cette approche fera de la maintenance un véritable cauchemar)

 SELECT a.column, b.column FROM table1 a, table2 b Ssortingng value = rs.getSsortingng(1); 

Une idée que j’ai eue est d’utiliser getTableName(iCol) pour récupérer les noms de table pour les colonnes nommées en double, puis envelopper un hachage de vos propres clés (avec le préfixe de nom de table) qui vous indiqueraient le bon index de colonne. référencez vos valeurs de colonne de cette façon. Cela nécessiterait une boucle initiale à travers les métadonnées au début de la configuration. Le seul problème que je vois avec ceci est que vous alias également les noms de table. Je n’ai pas encore trouvé de moyen d’obtenir ces alias de noms de tables à partir de jdbc sans les gérer vous-même lorsque vous construisez l’instruction sql. Cette solution dépendra de ce que serait le gain syntaxique pour vous.

Ok, il semble qu’il n’y ait pas de méthode comme resultSet.getSsortingng("a.columnName"); et vous devez alias vos colonnes au niveau sql, mais dans la mesure où il existe une getTableName(iCol) , j’espère que les gars de java.sql.ResultSet appendont une telle fonctionnalité.