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

时间:2018-10-24 14:08:07

标签: java sql spring jdbctemplate named-parameters

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

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

注意

我无权更改查询的调用方式,因此我无法添加命名的参数或仅传递其他参数。

3 个答案:

答案 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();