복붙노트

[SQL] IN 절을 매개 변수화를위한 JDBC를 사용하는 가장 좋은 방법은 무엇입니까? [복제]

SQL

IN 절을 매개 변수화를위한 JDBC를 사용하는 가장 좋은 방법은 무엇입니까? [복제]

나는 형태의 쿼리를 가지고 말

SELECT * FROM MYTABLE WHERE MYCOL in (?)

그리고의에 인수를 매개 변수화 할 수 있습니다.

는 SQL 자체를 수정하지 않고 여러 데이터베이스에서 작동 할 수있는 방법으로, JDBC와 자바에서이 작업을 수행 할 수있는 간단한 방법이 있나요?

내가 찾은 가장 가까운 질문은 자바 / JDBC에 대한 뭔가 다른이 있다면 내가 궁금하네요, C #을 함께 할 수 있었다.

해결법

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

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

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

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

    4.나는 많은 등으로 SQL 문자열을 구성하여이 문제를 해결? 나는 찾기 위해 값을 가질 수있다.

    나는 많은 등으로 SQL 문자열을 구성하여이 문제를 해결? 나는 찾기 위해 값을 가질 수있다.

    SELECT * FROM MYTABLE WHERE MYCOL in (?,?,?,?)
    

    우선 내가 문에 전달할 수있는 배열 형식을 검색하지만, 모든 JDBC 배열 형식은 벤더 고유합니다. 그래서 여러 머물렀다?.

  5. ==============================

    5.나는 (19.7.3)를 docs.spring에서 대답을 얻었다

    나는 (19.7.3)를 docs.spring에서 대답을 얻었다

    이 당신을 도울 수 있기를 바랍니다.

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

    6.AFAIK는 매개 변수로 컬렉션을 처리하기위한 JDBC의 표준 지원이 없습니다. 그냥 목록에 전달할 수하고 확장 할 것입니다 그것은 좋은 것입니다.

    AFAIK는 매개 변수로 컬렉션을 처리하기위한 JDBC의 표준 지원이 없습니다. 그냥 목록에 전달할 수하고 확장 할 것입니다 그것은 좋은 것입니다.

    Spring의 JDBC 액세스를 매개 변수로 컬렉션을 전달을 지원합니다. 이 안전하게이 코딩에 영감을 수행하는 방법을 볼 수 있었다.

    참조 JDBC 매개 변수로 컬렉션을 자동 확장

    (이 기사는 처음으로 최대 절전 모드에 대해 설명하고 JDBC를 논의하기 위해 계속된다.)

  7. ==============================

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

    8.우리가 사용할 수있는 다른 대체 방법이 있습니다.

    우리가 사용할 수있는 다른 대체 방법이 있습니다.

    여기에 이들에 대한 자세한 내용을 확인하십시오.

  9. ==============================

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

    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

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