我有一个用JdbcTemplate调用的查询,但是只发送了一个参数,我需要在两个where条件中使用一个参数。
String sql = "select * from employee where salary > ? and netpay > ?";
这里的参数仅仅是一个。即如果ID为TEST123
,则查询必须为
select * from employee where id = TEST123 and name = TEST123
,即使通过了一个参数。
getJdbcTemplate().query(sql, new Object[]{"TEST123"}, CustomResultSetExtractor());
有什么方法可以从查询端执行此操作,而不是传递两个参数?
我无权更改查询的调用方式,因此我无法添加命名的参数或仅传递其他参数。
答案 0 :(得分:1)
使用JdbcTemplate包装器NamedParameterJdbcTemplate:
模板类具有一组基本的JDBC操作,允许使用命名参数而不是传统的“?”占位符。
一旦从命名参数到JDBC样式'?'的替换,此类就委派给包装的JdbcTemplate。占位符在执行时完成。
您的SQL将带有1个参数:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="/somebody">Somebody</a>
<a href="/once">Once</a>
<a href="/told">Told</a>
<a href="/me">Me</a>
代码将是:
select * from employee where id = (:id) and name = (:id)
如果无法更改,则可以将查询更改为:
MapSqlParameterSource args = new MapSqlParameterSource();
args.addValue("id", TEST123);
return new NamedParameterJdbcTemplate(getJdbcTemplate()).query(sql , args, youRowMapper);
答案 1 :(得分:1)
我很惊讶您没有找到:
String sql = "select * from employee where id = ? and name = id";
或者您是说or
而不是and
?
String sql = "select * from employee where ? in (id, name)";
答案 2 :(得分:0)
我建议采取其他措施,例如,如果查询中有两个?
,然后像这样生成参数,则可以在Object数组中重复参数:
String param = "TEST123";
Object[] params = IntStream.range(0, 2)
.mapToObj(i -> param)
.toArray();
这将生成一个保存两次TEST123
的数组:
[TEST123, TEST123]
然后像您一样将Object数组发送到您的代码中。
getJdbcTemplate().query(sql, params, CustomResultSetExtractor());
如果您不知道查询中的保留数或参数数,可以像这样对它们进行计数:
int numberOfHold = sql.length() - sql.replaceAll("\\?", "").length();