복붙노트

[SQL] JDBC 결과는 테이블 별칭으로 열을 얻을

SQL

JDBC 결과는 테이블 별칭으로 열을 얻을

내가 쿼리 같은이 상상

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

어쩌면 두 테이블은 동일한 열 이름을 가지고있다. 내가 생각 그래서 그것을 통해 데이터에 액세스 할 수 좋을 것이다

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

그러나 저와 I에서이 역화는 아무것도 얻을 수 없다. 내가 API를 읽고,하지만 그들은 정말이 사건에 대해 이야기하지 않습니다. 이러한 기능 벤더 종속인가?

해결법

  1. ==============================

    1.JDBC는 단순히 쿼리에 지정된 무엇에 의해 열을 이름을 것 - 그것은 테이블 이름 등에 대해 알고하지 않습니다

    JDBC는 단순히 쿼리에 지정된 무엇에 의해 열을 이름을 것 - 그것은 테이블 이름 등에 대해 알고하지 않습니다

    당신은 두 가지 옵션이 있습니다 :

    옵션 1 : 다른 열 쿼리의 이름, 즉

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

    다음 자바 코드에 열 별칭을 참조 :

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

    옵션 2 : JDBC API에 대한 사용자의 통화에서 열 위치를 참조하십시오 :

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

    노트는 JDBC의 API는 하나 기반 인덱스를 사용하는 - 즉 그들이 (자바 같은 인덱스 0시), 그래서 번째 열 등의 첫 번째 열, 2 (1)를 사용하여 (1)로부터 계산

    그것이라는 이름의 열을 참조하는 것이 안전이기 때문에 나는, 옵션 1을 추천 할 것입니다 : 누군가가 쿼리의 열 순서를 변경할 수 있으며, 그것은 자동으로 코드 (잘못된 열을 액세스하는 것이나 모르는 것)을 깰 것이다,하지만 경우에 그들은 열 이름을 변경, 당신은 적어도 런타임에 "그런 칼럼"예외를 얻을 수 있습니다.

  2. ==============================

    2.ResultSetMetadata.getColumnLabel ()는 당신이 필요로하는 것입니다

    ResultSetMetadata.getColumnLabel ()는 당신이 필요로하는 것입니다

    (편집하다) 샘플 예, 같은 의견에 바랄으로 언급

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

    3.사용 열 별칭 같은 :

    사용 열 별칭 같은 :

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

    그리고 당신은 검색되는 모든 열을 지정 (좋은 연습입니다).

  4. ==============================

    4.당신이 MySQL을 사용하는 경우 바로 추가

    당신이 MySQL을 사용하는 경우 바로 추가

    &useOldAliasMetadataBehavior=true
    

    당신의 ConnectionString을합니다.

    그 후 당신은이 작은 도우미를 사용할 수 있습니다 :

    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);
        }
    
    }
    
  5. ==============================

    5.좋아, resultSet.getString ( "a.columnName")와 같은 어떠한 방법이 없다 보인다; 당신은, SQL 수준에서 열 별명에 있습니다 하지만 난에서 사람을 희망 getTableName (iCol) 방법이 있어요으로 진대 java.sql.ResultSet의 이러한 기능을 추가 할 수 있습니다.

    좋아, resultSet.getString ( "a.columnName")와 같은 어떠한 방법이 없다 보인다; 당신은, SQL 수준에서 열 별명에 있습니다 하지만 난에서 사람을 희망 getTableName (iCol) 방법이 있어요으로 진대 java.sql.ResultSet의 이러한 기능을 추가 할 수 있습니다.

  6. ==============================

    6.당신은 SQL 수준에 별칭을 사용할 수 있습니다. 그럼 당신은 인덱스에서 데이터를 검색 할 수 있습니다. (그러나이 방법은 유지 보수 진정한 악몽 것)

    당신은 SQL 수준에 별칭을 사용할 수 있습니다. 그럼 당신은 인덱스에서 데이터를 검색 할 수 있습니다. (그러나이 방법은 유지 보수 진정한 악몽 것)

    SELECT a.column, b.column FROM table1 a, table2 b
    
    String value = rs.getString(1);
    
  7. ==============================

    7.내가 가진 하나 개의 아이디어는, 다음, 올바른 열 인덱스로 포인트 것이라고 (테이블 이름 접두사) 자신의 키의 해시를 바꿈에 중복 이름의 열에 대한 테이블 이름을 잡기 위해 getTableName (iCol)를 사용하는 것입니다 당신의 열 값을 그런 식으로 참조합니다. 이 설정 시작 부분에 메타 데이터를 통해 초기 루프를 필요로한다. 나는이 함께 볼 수있는 유일한 문제는 당신이 아니라 테이블 이름을 앨리어싱한다는 것이다. 난 당신이 SQL 문을 빌드 할 때 스스로를 관리하지 않고 JDBC에서 해당 테이블 이름 별칭을 얻기의 방법을 찾아 아직했습니다. 이 솔루션은 구문 급료 지불이 당신에게 어떻게 될지에 따라 달라집니다.

    내가 가진 하나 개의 아이디어는, 다음, 올바른 열 인덱스로 포인트 것이라고 (테이블 이름 접두사) 자신의 키의 해시를 바꿈에 중복 이름의 열에 대한 테이블 이름을 잡기 위해 getTableName (iCol)를 사용하는 것입니다 당신의 열 값을 그런 식으로 참조합니다. 이 설정 시작 부분에 메타 데이터를 통해 초기 루프를 필요로한다. 나는이 함께 볼 수있는 유일한 문제는 당신이 아니라 테이블 이름을 앨리어싱한다는 것이다. 난 당신이 SQL 문을 빌드 할 때 스스로를 관리하지 않고 JDBC에서 해당 테이블 이름 별칭을 얻기의 방법을 찾아 아직했습니다. 이 솔루션은 구문 급료 지불이 당신에게 어떻게 될지에 따라 달라집니다.

  8. from https://stackoverflow.com/questions/7224024/jdbc-resultset-get-columns-with-table-alias by cc-by-sa and MIT license