[SQL] IN 절을 매개 변수화를위한 JDBC를 사용하는 가장 좋은 방법은 무엇입니까? [복제]
SQLIN 절을 매개 변수화를위한 JDBC를 사용하는 가장 좋은 방법은 무엇입니까? [복제]
나는 형태의 쿼리를 가지고 말
SELECT * FROM MYTABLE WHERE MYCOL in (?)
그리고의에 인수를 매개 변수화 할 수 있습니다.
는 SQL 자체를 수정하지 않고 여러 데이터베이스에서 작동 할 수있는 방법으로, JDBC와 자바에서이 작업을 수행 할 수있는 간단한 방법이 있나요?
내가 찾은 가장 가까운 질문은 자바 / JDBC에 대한 뭔가 다른이 있다면 내가 궁금하네요, C #을 함께 할 수 있었다.
해결법
-
==============================
1.JDBC에서이 작업을 수행 할 간단한 방법은 참으로 없다. 일부 JDBC 드라이버는 IN 절에서의 PreparedStatement # setArray ()를 지원하는 것. 난 단지있는 그 어떤 것들을 확실하지 않다.
JDBC에서이 작업을 수행 할 간단한 방법은 참으로 없다. 일부 JDBC 드라이버는 IN 절에서의 PreparedStatement # setArray ()를 지원하는 것. 난 단지있는 그 어떤 것들을 확실하지 않다.
당신은 그냥 절 및 PreparedStatement의 # setObject를 가진 루프에있는 모든 값을 설정하는 또 다른 도우미 메서드에 대한 자리 표시자를 생성하는 문자열 # 가입 ()와 컬렉션 # nCopies ()와 도우미 메서드를 사용할 수있다 ().
public static String preparePlaceHolders(int length) { return String.join(",", Collections.nCopies(length, "?")); } public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException { for (int i = 0; i < values.length; i++) { preparedStatement.setObject(i + 1, values[i]); } }
여기 당신이 그것을 사용할 수있는 방법은 다음과 같습니다
private static final String SQL_FIND = "SELECT id, name, value FROM entity WHERE id IN (%s)"; public List<Entity> find(Set<Long> ids) throws SQLException { List<Entity> entities = new ArrayList<Entity>(); String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size())); try ( Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(sql); ) { setValues(statement, ids.toArray()); try (ResultSet resultSet = statement.executeQuery()) { while (resultSet.next()) { entities.add(map(resultSet)); } } } return entities; } private static Entity map(ResultSet resultSet) throws SQLException { Enitity entity = new Entity(); entity.setId(resultSet.getLong("id")); entity.setName(resultSet.getString("name")); entity.setValue(resultSet.getInt("value")); return entity; }
일부 데이터베이스가 IN 절에있는 값의 허용 가능한 양의 제한이 있습니다. 예를 들어 오라클은 1000 개 항목에 대한이 제한이 있습니다.
-
==============================
2.아무도 때문에 큰 IN 절 (100 개 이상) 내가 JDBC를 위해 잘 작동이 문제에 내 솔루션을 던질거야의 경우 응답합니다. 짧은 I에서 INNER와 IN은 tmp를 테이블에 가입 교체합니다.
아무도 때문에 큰 IN 절 (100 개 이상) 내가 JDBC를 위해 잘 작동이 문제에 내 솔루션을 던질거야의 경우 응답합니다. 짧은 I에서 INNER와 IN은 tmp를 테이블에 가입 교체합니다.
내가 뭘하면 내가 배치 식별자 테이블을 호출하고 RDBMS I에 따라하는 것은 만들 수 있습니다 어떤 메이크업입니다 tmp를 테이블 그 또는 메모리 테이블입니다.
테이블은 두 개의 열이 있습니다. IN 절에서 ID와 내가 즉석에서 생성하는 배치 ID로 다른 열 한 열입니다.
SELECT * FROM MYTABLE M INNER JOIN IDTABLE T ON T.MYCOL = M.MYCOL WHERE T.BATCH = ?
당신이 선택하기 전에 당신은 주어진 배치 ID로 테이블에 사용자의 ID를 밀어. 그럼 당신은 그냥 INNER와 IN 절을 원래 쿼리를 대체는 BATCH_ID 현재 배치에 해당하여 IDS 테이블에 일치 가입하세요. 당신이 완료되면 당신의 당신 배치에 대한 항목을 삭제합니다.
-
==============================
3.(당신은 스프링 JDBC를 사용하는 경우)이이 수행하는 표준 방법은 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate 클래스를 사용하는 것입니다.
(당신은 스프링 JDBC를 사용하는 경우)이이 수행하는 표준 방법은 org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate 클래스를 사용하는 것입니다.
이 클래스를 사용하면, 당신의 SQL 매개 변수로 목록을 정의하고 명명 된 매개 변수를 교체하는 NamedParameterJdbcTemplate를 사용할 수 있습니다. 예를 들면 :
public List<MyObject> getDatabaseObjects(List<String> params) { NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource); String sql = "select * from my_table where my_col in (:params)"; List<MyObject> result = jdbcTemplate.query(sql, Collections.singletonMap("params", params), myRowMapper); return result; }
-
==============================
4.나는 많은 등으로 SQL 문자열을 구성하여이 문제를 해결? 나는 찾기 위해 값을 가질 수있다.
나는 많은 등으로 SQL 문자열을 구성하여이 문제를 해결? 나는 찾기 위해 값을 가질 수있다.
SELECT * FROM MYTABLE WHERE MYCOL in (?,?,?,?)
우선 내가 문에 전달할 수있는 배열 형식을 검색하지만, 모든 JDBC 배열 형식은 벤더 고유합니다. 그래서 여러 머물렀다?.
-
==============================
5.나는 (19.7.3)를 docs.spring에서 대답을 얻었다
나는 (19.7.3)를 docs.spring에서 대답을 얻었다
이 당신을 도울 수 있기를 바랍니다.
-
==============================
6.AFAIK는 매개 변수로 컬렉션을 처리하기위한 JDBC의 표준 지원이 없습니다. 그냥 목록에 전달할 수하고 확장 할 것입니다 그것은 좋은 것입니다.
AFAIK는 매개 변수로 컬렉션을 처리하기위한 JDBC의 표준 지원이 없습니다. 그냥 목록에 전달할 수하고 확장 할 것입니다 그것은 좋은 것입니다.
Spring의 JDBC 액세스를 매개 변수로 컬렉션을 전달을 지원합니다. 이 안전하게이 코딩에 영감을 수행하는 방법을 볼 수 있었다.
참조 JDBC 매개 변수로 컬렉션을 자동 확장
(이 기사는 처음으로 최대 절전 모드에 대해 설명하고 JDBC를 논의하기 위해 계속된다.)
-
==============================
7.내 시행이 성공을 참조하십시오, 목록의 크기가 잠재적 한계가 있다고한다. 리스트 L은 Arrays.asList을 = (새로운 정수 [{12496,12497,12498,12499}); 지도 PARAM = Collections.singletonMap ( "goodsid", L);
내 시행이 성공을 참조하십시오, 목록의 크기가 잠재적 한계가 있다고한다. 리스트 L은 Arrays.asList을 = (새로운 정수 [{12496,12497,12498,12499}); 지도 PARAM = Collections.singletonMap ( "goodsid", L);
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource()); String sql = "SELECT bg.goodsid FROM beiker_goods bg WHERE bg.goodsid in(:goodsid)"; List<Long> list = namedParameterJdbcTemplate.queryForList(sql, param2, Long.class);
-
==============================
8.우리가 사용할 수있는 다른 대체 방법이 있습니다.
우리가 사용할 수있는 다른 대체 방법이 있습니다.
여기에 이들에 대한 자세한 내용을 확인하십시오.
-
==============================
9.sormula이 단순 (실시 예 4 참조)한다 :
sormula이 단순 (실시 예 4 참조)한다 :
ArrayList<Integer> partNumbers = new ArrayList<Integer>(); partNumbers.add(999); partNumbers.add(777); partNumbers.add(1234); // set up Database database = new Database(getConnection()); Table<Inventory> inventoryTable = database.getTable(Inventory.class); // select operation for list "...WHERE PARTNUMBER IN (?, ?, ?)..." for (Inventory inventory: inventoryTable. selectAllWhere("partNumberIn", partNumbers)) { System.out.println(inventory.getPartNumber()); }
-
==============================
10.내가 생각할 수있는 한 가지 방법은 java.sql.PreparedStatement의 배심원 담합의 비트를 사용하는 것입니다
내가 생각할 수있는 한 가지 방법은 java.sql.PreparedStatement의 배심원 담합의 비트를 사용하는 것입니다
PreparedStatement의 preparedStmt = conn.prepareStatement ( "SELECT * FROM MYTABLE WHERE MYCOL에서 ()?")을;
... 그리고 ...
preparedStmt.setString (1, [하여 stringged PARAMS]);
http://java.sun.com/docs/books/tutorial/jdbc/basics/prepared.html
from https://stackoverflow.com/questions/2861230/what-is-the-best-approach-using-jdbc-for-parameterizing-an-in-clause by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] MS SQL 서버에서 테이블 예약 된 단어 이름 / 키워드 만들기 [마감] (0) | 2020.03.22 |
---|---|
[SQL] 당신은 어떻게 SQL Server 테이블의 기본 키를 나열합니까? (0) | 2020.03.22 |
[SQL] WHERE 절에 별칭을 사용하여 (0) | 2020.03.22 |
[SQL] SQL : 하나 개의 필드에 최소 값을 기준으로 그룹은 별개의 행을 선택하는 동안 (0) | 2020.03.22 |
[SQL] MySQL은 계산 나이 (이노) (0) | 2020.03.22 |