32

私は名前のリストを持っています。

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

と声明:

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

以下を行う方法:

stmt.setParameterList(1,names);

回避策はありますか? このメソッドが欠落している理由を誰かが説明できますか?

使用: java、postgresql、jdbc3

4

8 に答える 8

22

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

この回答はhttps://stackoverflow.com/a/10240302/573057に役立つ可能性があります

于 2012-11-07T17:38:11.387 に答える
20

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

適切な数の疑問符 (リストと同じ数) を使用して SQL ステートメントを作成する (または単一の ? または同様のトークンを置き換える) コードを記述し、それぞれのパラメーターを設定してリストを反復処理します。

于 2009-08-20T10:36:57.807 に答える
2

このメソッドは型消去のために欠落しています。Listのパラメータ型は実行時に失われます。したがって、いくつかのメソッドを追加する必要があります: setIntParameterssetLongParameterssetObjectParametersなど

于 2009-08-20T10:38:07.820 に答える
1

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());
于 2011-05-09T22:31:45.493 に答える
0

質問の意味が、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ラムダに自由に変換してください:)

于 2016-04-10T14:05:25.840 に答える
-1

私は今朝コードを見直していましたが、同僚の 1 人が別のアプローチをとっていましたsetString("name1','name2','name3")

注:これらは.によって追加されるため、最初と最後の一重引用符をスキップしましたsetString

于 2012-07-24T14:08:35.780 に答える