我使用的是NamedParameterJdbcTemplate,但发现此问题出现在底层的JdbcTemplate类中,因此我将在JdbcTemplate中显示问题(所以我们不要担心SQL查询的安全性)。
这是我想要实现的目标:
String sql = "SELECT * FROM clients ORDER BY ? ?";
return jdbcTemplate.query(sql,
new Object[] { "name", "ASC" },
new ClientResultSetExtractor());
我希望第一个占位符替换为“name”,第二个占用“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
我做错了什么?
修改
我假设问题是顺序中的两个占位符,但即使我删除第一个,它仍然不会接受最后一个,它应该告诉查询是否按ASC或DESC顺序排序。这是一个错误,如果没有,为什么这是不可接受的????
答案 0 :(得分:2)
您尝试错误地使用参数。
参数不是列名或SQL语句关键字。它们是数据内容(例如,WHERE LastName = ?
是有效的参数化语句,WHERE ? = 'Smith'
不是)。