web-dev-qa-db-ja.com

準備済みステートメントにパラメーターのリストを設定する方法は?

私は名前のリストを持っています、例えば:

List<String> names = ...
names.add('charles');
...

およびステートメント:

PreparedStatement stmt = 
  conn.prepareStatement('select * from person where name in ( ? )');

次の方法:

stmt.setParameterList(1,names);

回避策はありますか?誰かがこの方法が欠けている理由を説明できますか?

使用:Java、postgresql、jdbc3

28
Chris

私が知っているPreparedStatementにリストを設定するだけでは、これを行う明確な方法はありません。

SQLステートメントを構築する(または単一の?または同様のトークンを適切に置き換える)コードを適切な数のクエスチョンマーク(リストと同じ数)で記述し、リストを反復してそれぞれのパラメーターを設定します。

17
Nick Holt

この質問は非常に古いですが、誰も setArray を使用することを提案していません

この答えは役立つかもしれません https://stackoverflow.com/a/10240302/573057

19
earcam

Postgres 9では、このアプローチを使用しました。

 jdbcTemplate.query(getEmployeeReport(), new PreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps) throws SQLException {
            ps.setTimestamp(1, new Java.sql.Timestamp(from.getTime()));
            ps.setTimestamp(2, new Java.sql.Timestamp(to.getTime()));
            StringBuilder ids = new StringBuilder();
            for (int i = 0; i < branchIds.length; i++) {
                ids.append(branchIds[i]);
                if (i < branchIds.length - 1) {
                    ids.append(",");
                }
            }
            // third param is inside IN clause
            // Use Types.OTHER avoid type check while executing query  
            ps.setObject(3, ids.toString(), **Types.OTHER**);
        }
    }, new PersonalReportMapper());
2
junior

type erasureにより、このメソッドは欠落しています。リストのパラメータータイプは実行時に失われます。したがって、いくつかのメソッドを追加する必要があります:setIntParameterssetLongParameterssetObjectParametersなど

1
dfa

質問の意味が、1回の呼び出しで複数のパラメーターを設定することである場合...

型の検証はすでにより高いレベルで定義されているため、必要なのは setObject(...) だけだと思います。

したがって、ユーティリティメソッドを使用できます。

public static void addParams(PreparedStatement preparedStatement, Object... params) throws SQLException {
    for (int i = 0; i < params.length; i++) {
        Object param = params[i];
        preparedStatement.setObject(i+1, param);
    }
}

使用法:

SqlUtils.addParams(preparedStatement, 1, '2', 3d);

これをJava 8ラムダ:)に自由に変換してください

0