不使用命名参数时重用 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)";
我有一个使用 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)";