1

引用符で囲まれたものがたくさんある場合、次のようなことをしていることに気づきます。

String sql = "SELECT col1, col2, col3 "
           + "FROM my_awesome_table "
           + "WHERE strValue IN (%s)";

sql = String.format(sql, COMMA_JOINER.join(Iterables.transform(strValues,
                                                               new Function<String, String>() {
                                                                   @Override
                                                                   public String apply(String input) {
                                                                       return "'" + input.replaceAll("'", "''") + "'";
                                                                   }
                                                               })));

List<ResultObject> resultObjects =
        getSimpleJdbcTemplate().query(sql, resultObjectRowMapper());

しかし、独自の IN 句を作成し、文字列を一重引用符で囲み、自分でエスケープする必要があるのは奇妙に思えます。もっと良い方法があるはずです!いくつかの追加のコンテキスト: クエリを大量に (最大で数十または数百行) 行うことは期待していません。一度に 1 行ずつクエリを実行しない限り、最適化はそれほど重要ではありません。

4

2 に答える 2

4

まず、JdbcTemplateがなくても、プリペアドステートメントを使用する必要があります。したがって、JDBCドライバーに引用符をエスケープさせます。SQLクエリは次のようになります

select ... where strValue in (?, ?, ?, ?)

PreparedStatement.setParameter()そして、何もエスケープする必要なしに、を使用して各パラメーターをバインドします。

NamedParameterJdbcTemplateを使用すると、Springで文字列のコレクション全体に単一のパラメーターを使用できるため、さらに簡単になります。その使用法はSpringのドキュメントで説明されています:

String sql = "select ... from ... where strValue in :listOfValues";
Map namedParameters = Collections.singletonMap("listOfValues", strValues);
...
于 2012-06-20T21:35:16.140 に答える
2

springsourceのこのスレッドによると、次のように機能するはずです。

String sql = "SELECT col1, col2, col3 "
       + "FROM my_awesome_table "
       + "WHERE strValue IN (:items)";

getSimpleJdbcTemplate().query(
    sql
,   Collections.singletonMap("items", strValues)
,   resultObjectRowMapper()
);
于 2012-06-20T21:32:58.520 に答える