[SQL] JDBC 결과는 테이블 별칭으로 열을 얻을
SQLJDBC 결과는 테이블 별칭으로 열을 얻을
내가 쿼리 같은이 상상
SELECT * from table1 a, table2 b where (WHATEVER)
어쩌면 두 테이블은 동일한 열 이름을 가지고있다. 내가 생각 그래서 그것을 통해 데이터에 액세스 할 수 좋을 것이다
resultSet.getString("a.columnName");
resultSet.getString("b.columnName");
그러나 저와 I에서이 역화는 아무것도 얻을 수 없다. 내가 API를 읽고,하지만 그들은 정말이 사건에 대해 이야기하지 않습니다. 이러한 기능 벤더 종속인가?
해결법
-
==============================
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.ResultSetMetadata.getColumnLabel ()는 당신이 필요로하는 것입니다
ResultSetMetadata.getColumnLabel ()는 당신이 필요로하는 것입니다
(편집하다) 샘플 예, 같은 의견에 바랄으로 언급
SELECT * from table1 a, table2 b where (WHATEVER) ResultSetMetaData rsmd = rset.getMetaData(); rsmd.getColumnLabel(1);
-
==============================
3.사용 열 별칭 같은 :
사용 열 별칭 같은 :
SELECT A.ID 'A_ID', B.ID 'B_ID' FROM TABLE1 AS A, TABLE2 AS B...
그리고 당신은 검색되는 모든 열을 지정 (좋은 연습입니다).
-
==============================
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.좋아, resultSet.getString ( "a.columnName")와 같은 어떠한 방법이 없다 보인다; 당신은, SQL 수준에서 열 별명에 있습니다 하지만 난에서 사람을 희망 getTableName (iCol) 방법이 있어요으로 진대 java.sql.ResultSet의 이러한 기능을 추가 할 수 있습니다.
좋아, resultSet.getString ( "a.columnName")와 같은 어떠한 방법이 없다 보인다; 당신은, SQL 수준에서 열 별명에 있습니다 하지만 난에서 사람을 희망 getTableName (iCol) 방법이 있어요으로 진대 java.sql.ResultSet의 이러한 기능을 추가 할 수 있습니다.
-
==============================
6.당신은 SQL 수준에 별칭을 사용할 수 있습니다. 그럼 당신은 인덱스에서 데이터를 검색 할 수 있습니다. (그러나이 방법은 유지 보수 진정한 악몽 것)
당신은 SQL 수준에 별칭을 사용할 수 있습니다. 그럼 당신은 인덱스에서 데이터를 검색 할 수 있습니다. (그러나이 방법은 유지 보수 진정한 악몽 것)
SELECT a.column, b.column FROM table1 a, table2 b String value = rs.getString(1);
-
==============================
7.내가 가진 하나 개의 아이디어는, 다음, 올바른 열 인덱스로 포인트 것이라고 (테이블 이름 접두사) 자신의 키의 해시를 바꿈에 중복 이름의 열에 대한 테이블 이름을 잡기 위해 getTableName (iCol)를 사용하는 것입니다 당신의 열 값을 그런 식으로 참조합니다. 이 설정 시작 부분에 메타 데이터를 통해 초기 루프를 필요로한다. 나는이 함께 볼 수있는 유일한 문제는 당신이 아니라 테이블 이름을 앨리어싱한다는 것이다. 난 당신이 SQL 문을 빌드 할 때 스스로를 관리하지 않고 JDBC에서 해당 테이블 이름 별칭을 얻기의 방법을 찾아 아직했습니다. 이 솔루션은 구문 급료 지불이 당신에게 어떻게 될지에 따라 달라집니다.
내가 가진 하나 개의 아이디어는, 다음, 올바른 열 인덱스로 포인트 것이라고 (테이블 이름 접두사) 자신의 키의 해시를 바꿈에 중복 이름의 열에 대한 테이블 이름을 잡기 위해 getTableName (iCol)를 사용하는 것입니다 당신의 열 값을 그런 식으로 참조합니다. 이 설정 시작 부분에 메타 데이터를 통해 초기 루프를 필요로한다. 나는이 함께 볼 수있는 유일한 문제는 당신이 아니라 테이블 이름을 앨리어싱한다는 것이다. 난 당신이 SQL 문을 빌드 할 때 스스로를 관리하지 않고 JDBC에서 해당 테이블 이름 별칭을 얻기의 방법을 찾아 아직했습니다. 이 솔루션은 구문 급료 지불이 당신에게 어떻게 될지에 따라 달라집니다.
from https://stackoverflow.com/questions/7224024/jdbc-resultset-get-columns-with-table-alias by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MySQL은 : 어떻게 같은 테이블에 여러 번 참여합니까? (0) | 2020.05.04 |
---|---|
[SQL] 오라클의 DECODE 함수의 MySQL의 동등한 (0) | 2020.05.04 |
[SQL] 날짜에 SQL 서버 변환 문자열 (0) | 2020.05.04 |
[SQL] MySQL의 오류 1241 : 피연산자 1 열을 포함해야합니다 (들) (0) | 2020.05.04 |
[SQL] 저장 프로 시저에서 MySQL의 동적 쿼리 (0) | 2020.05.04 |