不使用命名参数时重用 sql 参数

reuse sql param when not using named parameters

我有一个使用 JdbcTemplate 调用的查询,但只发送了一个参数,我需要在两个 where 条件下使用该参数。

查询

String sql = "select * from employee where salary > ? and netpay > ?";

召唤

这里的参数只有一个。 IE。如果 id 是 TEST123 查询需要是

select * from employee where id = TEST123 and name = TEST123 即使传递了一个参数。

getJdbcTemplate().query(sql, new Object[]{"TEST123"}, CustomResultSetExtractor());

有没有什么方法可以从查询端执行此操作而不是传递两个参数?

注意

我无权更改调用查询的方式,因此我无法添加命名参数,或者只是传递一个附加参数。

使用 NamedParameterJdbcTemplate,一个 JdbcTemplate 包装器:

Template class with a basic set of JDBC operations, allowing the use of named parameters rather than traditional '?' placeholders.

This class delegates to a wrapped JdbcTemplate once the substitution from named parameters to JDBC style '?' placeholders is done at execution time.

您的 SQL 将带有 1 个参数:

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);

如果无法更改,可以将查询更改为:

 select * from employee where id = ? and id = name

我会提出其他建议,例如,如果您的查询有两个 ?,您可以在对象数组中重复您的参数,然后像这样生成参数:

String param = "TEST123";
Object[] params = IntStream.range(0, 2)
        .mapToObj(i -> param)
        .toArray();

这将生成一个包含两次的数组 TEST123 :

[TEST123, TEST123]

然后像您一样将对象数组发送到您的代码。

getJdbcTemplate().query(sql, params, CustomResultSetExtractor());

如果您不知道查询中保留或参数的数量,您可以这样计算它们:

int numberOfHold = sql.length() - sql.replaceAll("\?", "").length();

我很惊讶你没有找到:

String sql = "select * from employee where id = ? and name = id";

或者您的意思是 or 而不是 and

String sql = "select * from employee where ? in (id, name)";