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のどちらの順序で並べ替えるかがクエリに示されます。これはバグですか、そうでない場合は、なぜこれが受け入れられないのですか????