【问题标题】:Can't pass multiple arguments to SQL statement into wildcard [duplicate]无法将多个参数传递给 SQL 语句到通配符 [重复]
【发布时间】:2021-02-06 14:39:24
【问题描述】:

我有这段代码

 final List<Account> result = this.jdbcTemplate.query(LIST_OF_ACCOUNT_SQL, new String[]{ids},

当我只传递一个参数时

        final String ids= "3213";

代码运行良好。

但我在将多个参数传递给通配符时遇到问题

final String ids= "3213, 2313";

这是我的 SQL

"SELECT ID, NAME FROM ACCOUNT WHERE STATUS = 'OK' AND ID IN (?) ";

我正在使用 Oracle 数据库。

【问题讨论】:

    标签: java sql


    【解决方案1】:

    您可以使用以下方式

    String inSql = String.join(",", Collections.nCopies(ids.size(), "?"));
     
    
    
    List<Account> result = jdbcTemplate.query(
          String.format("SELECT ID, NAME FROM ACCOUNT WHERE STATUS = 'OK' AND ID IN  (%s)", inSql), 
          ids.toArray(), 
          (rs, rowNum) -> new Account(rs.getInt("ID"), rs.getString("NAME")));
    

    【讨论】:

      【解决方案2】:

      您可能需要使用 NamedParameterJdbcTemplateMapSqlParameterSource 来处理数组数据:

      static String LIST_OF_ACCOUNT_SQL = "SELECT ID, NAME FROM Accounts WHERE STATUS = 'OK' AND ID IN (:ids)";
      
      private NamedParameterJdbcTemplate namedJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
      
      public static List<Account> getAccountsByIds(String[] ids) {
          SqlParameterSource parameters = new MapSqlParameterSource("ids", ids);
      
          return this.namedJdbcTemplate.query(
                  LIST_OF_ACCOUNT_SQL, 
                  parameters,
                  (rs, rowNum) -> new Account(rs.getInt("ID"), rs.getString("NAME"))
          );
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 2013-03-22
        • 2011-08-07
        • 2016-10-25
        • 1970-01-01
        • 2021-09-28
        • 2011-06-11
        相关资源
        最近更新 更多