JDBC ResultSet obtenir des colonnes avec des alias de table

Imaginez 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 pensais qu'il serait bien d'accéder aux données via

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

mais ce contre-temps sur moi et je n'obtiens rien. J'ai lu L'API, mais ils ne parlent pas vraiment de cette affaire. Une telle fonctionnalité dépend-elle du vendeur?

40
demandé sur Franz Kafka 2011-08-29 01:21:39

7 réponses

JDBC va simplement nommer les colonnes par ce qui est spécifié dans la requête - il ne connaît pas les noms de table etc.

Vous avez deux options:

Option 1: nommer les colonnes différemment dans la requête, c'est à dire

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

alors dans votre code java, référez-vous à la colonne Alias:

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



Option 2: voir la colonne position dans votre appel à la JDBC API:

resultSet.getString(1);
resultSet.getString(2);

notez que L'API JDBC utilise base index - c'est à dire qu'ils comptent à partir de 1 (pas de 0 comme les index java), donc utilisez 1 pour la première colonne, 2 pour la deuxième colonne, etc



Je recommande l'option 1, parce qu'il est plus sûr de se référer à des colonnes nommées: Quelqu'un peut changer l'ordre des colonnes dans la requête et cela briserait silencieusement votre code (vous accéderiez à la mauvaise colonne mais ne know), mais s'ils changent les noms des colonnes, vous obtiendrez au moins une exception "no such column" à l'exécution.

41
répondu Bohemian 2011-08-28 21:40:26

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);
12
répondu Mateen 2017-01-10 07:00:56

Utilisez des alias de colonne comme:

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

Et spécifier toutes les colonnes de la récupération (une bonne pratique).

8
répondu David Oliván Ubieto 2018-04-24 08:10:46

Si vous utilisez MySQL juste ajouter

&useOldAliasMetadataBehavior=true

pour votre connectionString.

après vous pouvez utiliser ce petit Helper:

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<String, Integer> 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);
    }

}
3
répondu Halko Karr-Sajtarevic 2017-01-05 17:20:32

Vous pouvez utiliser alias au niveau SQL. Puis vous récupérez des données par index. (Mais cette démarche permettra de faire de l'entretien un vrai cauchemar)

SELECT a.column, b.column FROM table1 a, table2 b

String value = rs.getString(1);
0
répondu Ammar 2011-08-28 21:30:47

Une idée que j'avais est d'utiliser le getTableName(iCol) pour saisir les noms de table pour les colonnes nommées en double, puis envelopper un hachage de vos propres clés (avec le préfixe du nom de la table) qui vous indiquerait le bon index de colonne, et référencer vos valeurs de colonne de cette façon. Cela nécessiterait une première boucle à travers les méta-données au début. Le seul problème que je vois avec ceci est que vous aliasing les noms de table aussi bien. Je n'ai pas encore trouvé un moyen d'obtenir ces pseudonymes de noms de table jdbc sans le gérer vous-même lorsque vous construisez la déclaration sql. Cette solution dépendrait de ce que le gain syntaxique serait pour vous.

0
répondu inyourcorner 2011-10-14 18:41:01

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

0
répondu Mostafa 2012-10-26 07:04:17