【问题标题】:How to pass list of values as a parameter to IN clause using jdbc template [duplicate]如何使用jdbc模板将值列表作为参数传递给IN子句[重复]
【发布时间】:2018-01-23 14:06:19
【问题描述】:

我想将汽车名称作为绑定变量传递(在运行时更改)如何实现。

Java 1.7 版

private JdbcTemplate jdbcTemplate;

 public Collection<Cars> findAll(){

 String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in ('Honda','Audi','Benz')";
        List<Cars> carsList = new ArrayList<Cars>();
        List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
        for (Map row : rows) {
            Cars car = new Cars();
            car.setName(String.valueOf(row.get("NAME")));
            car.setType(String.valueOf(row.get("TYPE")));
            car.setYear(String.valueOf(row.get("YEAR")));

            carsList.add(car);
        }
        return carsList;
    }

【问题讨论】:

    标签: java jdbctemplate


    【解决方案1】:

    按照here 的说明使用命名参数,例如:

    String sql =  "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (:cars)";
    List<Cars> carsList = new ArrayList<Cars>();
    NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(datasource);
    List<String> carNames = new ArrayList<String>();
    for(Car car : carList){
        carNames.add(car.getName());
    }
    SqlParameterSource namedParameters = new MapSqlParameterSource("cars", carNames);
    namedParameterJdbcTemplate.queryForObject(sql, namedParameters, ResponseType.class);
    

    【讨论】:

      【解决方案2】:
      jdbcTemplate.queryForList(
          "SELECT NAME, YEAR, TYPE FROM CARS where NAME in (?,?,?)",
          new Object[] { "Honda", "Audi", "Benz" }
      );
      

      您可能应该将逻辑包装到一个接受 IN 值并生成适当问号序列的方法中。

      一些框架(如 MyBatis)已经内置了对此的支持。

      另外请记住,不同的数据库对 IN 列表(或整个查询)的长度有不同的限制。如果要在 IN 子句中放入太多值,则必须处理此问题(将其分解为适当大小的“批次”或完全使用不同的方法)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-27
        • 1970-01-01
        • 2011-06-11
        • 2011-09-14
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        相关资源
        最近更新 更多