55 votes

JDBC ResultSet obtient des colonnes avec un 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. J'ai donc pensé que ce serait bien d'accéder aux données via

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

Mais cela se retourne contre moi et je n'obtiens rien. J'ai lu l'API, mais ils ne parlent pas vraiment de ce cas. Une telle fonctionnalité dépend-elle du fournisseur ?

15voto

mateen Points 21

ResultSetMetadata.getColumnLabel() est ce dont vous avez besoin

(Éditer) 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);

8voto

Utilisez des alias de colonne tels que :

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

5voto

Si vous utilisez MySQL, ajoutez simplement

 &useOldAliasMetadataBehavior=true

à votre connectionString.

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

}

1voto

Mostafa Points 21

Ok, il semble qu'il n'y ait pas de méthode comme resultSet.getString("a.columnName"); et vous devez aliaser 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 ajoutent une telle fonctionnalité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X