web-dev-qa-db-ja.com

jdbcテンプレートを使用してIN句にパラメーターとして値のリストを渡す方法

車名をバインド変数として渡す(実行時に変更される)方法.

Javaバージョン1.7

private JdbcTemplate jdbcTemplate;

 public Collection<Cars> findAll(){

 String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in ('Honda','Audi','Benz')";
        List<Cars> carsList = new ArrayList<Cars>();
        List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
        for (Map row : rows) {
            Cars car = new Cars();
            car.setName(String.valueOf(row.get("NAME")));
            car.setType(String.valueOf(row.get("TYPE")));
            car.setYear(String.valueOf(row.get("YEAR")));

            carsList.add(car);
        }
        return carsList;
    }
7
Jan69

説明されているように名前付きパラメータを使用します here 、例:

String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (:cars)";
List<Cars> carsList = new ArrayList<Cars>();
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(datasource);
List<String> carNames = new ArrayList<String>();
for(Car car : carList){
    carNames.add(car.getName());
}
SqlParameterSource namedParameters = new MapSqlParameterSource("cars", carNames);
namedParameterJdbcTemplate.queryForObject(sql, namedParameters, ResponseType.class);
12
Darshan Mehta
jdbcTemplate.queryForList(
    "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (?,?,?)",
    new Object[] { "Honda", "Audi", "Benz" }
);

おそらく、IN値を受け入れ、疑問符の適切なシーケンスを生成するメソッドにロジックをラップする必要があります。

一部のフレームワーク(MyBatisなど)には、このサポートが組み込まれています。

また、DBごとに、INリスト(またはクエリ全体)の長さの制限が異なることに注意してください。 IN句に入れるには値が多すぎる場合は、これを処理する必要があります(適切なサイズの「バッチ」に分解するか、まったく異なるアプローチを使用します)。

1
Jiri Tousek