首页 > 解决方案 > 不使用命名参数时重用 sql 参数

问题描述

我有一个使用 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());

有没有办法从查询端做到这一点而不是传递两个参数?

笔记

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

标签: javasqlspringjdbctemplatenamed-parameters

解决方案


使用NamedParameterJdbcTemplate,一个 JdbcTemplate 包装器:

具有一组基本 JDBC 操作的模板类,允许使用命名参数而不是传统的“?” 占位符。

一旦从命名参数替换为 JDBC 样式“?”,此类将委托给包装的 JdbcTemplate 占位符在执行时完成。

您的 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

推荐阅读