2

NamedParameterJdbcTemplateを使用していますが、この問題は基になるJdbcTemplateクラスにあることがわかったため、JdbcTemplateで発生する問題を示します(ここでSQLクエリの安全性について心配する必要はありません)。

これが私が達成しようとしていることです:

String sql = "SELECT * FROM clients ORDER BY ? ?";
    return jdbcTemplate.query(sql,
            new Object[] { "name", "ASC" },
            new ClientResultSetExtractor());

最初のプレースホルダーが「name」に置き換えられ、2番目のプレースホルダーが「ASC」に置き換えられることを期待していました。これにより、有効なSQLクエリが作成されます。

SELECT * FROM clients ORDER BY name ASC

ただし、残念ながら、そのjdbcクエリの実行は機能しません。

ERROR:  syntax error at or near "$2" at character 35
STATEMENT:  SELECT * FROM clients ORDER BY $1 $2

私は何が間違っているのですか?

編集

問題は2つのプレースホルダーが順番にあることだと思っていましたが、最初のプレースホルダーを削除しても、最後のプレースホルダーだけが受け入れられないため、ASCまたはDESCのどちらの順序で並べ替えるかがクエリに示されます。これはバグですか、そうでない場合は、なぜこれが受け入れられないのですか????

4

1 に答える 1

2

パラメータを誤って使用しようとしています。

パラメーターは、列名またはSQLステートメントのキーワードではありません。それらはデータコンテンツです(たとえばWHERE LastName = ?、有効なパラメータ化されたステートメントですが、そうでWHERE ? = 'Smith'はありません)。

于 2012-06-11T02:48:58.820 に答える