【问题标题】:reuse sql param when not using named parameters不使用命名参数时重用 sql 参数
【发布时间】:2019-03-28 23:51:24
【问题描述】:

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

有没有办法从查询端执行此操作而不是传递两个参数?

注意

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

【问题讨论】:

  • @YCF_L 感谢您的努力。问题是我无法访问服务本身我只传递查询,然后他们构建和调用。这就是我从 SQL 方面寻找解决方法的原因。

标签: java sql spring jdbctemplate named-parameters


【解决方案1】:

使用 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

【讨论】:

  • 我投了赞成票,因为这将是理想的解决方案。但是我正在使用我传递查询的服务并且他们没有使用命名参数(它是我无法控制的服务,我只是传递查询),他们正在使用这些问号。我想知道在我的查询中是否可以做任何事情来重用。就像3? 一样,我指定了第三个参数。
  • @EduardoDennis 可以将不带参数的完整 SQL 发送到服务吗?
  • 我传递了字符串"select * from employee where id = ?",它将替换为特定的id并执行并返回结果。但现在我需要添加额外的位置。引用他们正在添加的一个参数。
  • @EduardoDennis 用另一个解决方案更新我的答案
  • where id=? and id= name 叫什么名字?
【解决方案2】:

我会提出其他建议,您可以在 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();

【讨论】:

    【解决方案3】:

    我很惊讶你没有找到:

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

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

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

    【讨论】:

    • 我举了一个基本的例子来尝试看看是否有一种方法可以重用一个参数。但我的实际查询是 select * from employee where id =?和名称 > ?。有一些 sql 魔法吗?
    • name > id?还是name LIKE (id || '%')?但我想这更棘手。
    猜你喜欢
    • 2014-09-20
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多