私は名前のリストを持っています、例えば:
List<String> names = ...
names.add('charles');
...
およびステートメント:
PreparedStatement stmt =
conn.prepareStatement('select * from person where name in ( ? )');
次の方法:
stmt.setParameterList(1,names);
回避策はありますか?誰かがこの方法が欠けている理由を説明できますか?
使用:Java、postgresql、jdbc3
私が知っているPreparedStatement
にリストを設定するだけでは、これを行う明確な方法はありません。
SQLステートメントを構築する(または単一の?または同様のトークンを適切に置き換える)コードを適切な数のクエスチョンマーク(リストと同じ数)で記述し、リストを反復してそれぞれのパラメーターを設定します。
この質問は非常に古いですが、誰も setArray を使用することを提案していません
この答えは役立つかもしれません https://stackoverflow.com/a/10240302/573057
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());
type erasureにより、このメソッドは欠落しています。リストのパラメータータイプは実行時に失われます。したがって、いくつかのメソッドを追加する必要があります:setIntParameters
、setLongParameters
、setObjectParameters
など
質問の意味が、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ラムダ:)に自由に変換してください