代码之家  ›  专栏  ›  技术社区  ›  Malax

如何使用Spring的JDBCTemplate有效地执行in()SQL查询?

  •  159
  • Malax  · 技术社区  · 16 年前

    我想知道是否有一种更优雅的方法可以使用Spring的JDBCTemplate执行in()查询。目前我做的事情是这样的:

    StringBuilder jobTypeInClauseBuilder = new StringBuilder();
    for(int i = 0; i < jobTypes.length; i++) {
        Type jobType = jobTypes[i];
    
        if(i != 0) {
            jobTypeInClauseBuilder.append(',');
        }
    
        jobTypeInClauseBuilder.append(jobType.convert());
    }
    

    这是非常痛苦的,因为如果我有九行只是为了构建in()查询的子句。我想要一些类似于准备好的语句的参数替换

    5 回复  |  直到 7 年前
        1
  •  230
  •   stivlo    9 年前

    需要参数源:

    Set<Integer> ids = ...;
    
    MapSqlParameterSource parameters = new MapSqlParameterSource();
    parameters.addValue("ids", ids);
    
    List<Foo> foo = getJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",
         parameters, getRowMapper());
    

    只有当 getJdbcTemplate() 返回类型为的实例 NamedParameterJdbcTemplate

        2
  •  50
  •   RustyTheBoyRobot MatCas    10 年前

    我使用SpringJDBC执行“in子句”查询,如下所示:

    String sql = "SELECT bg.goodsid FROM beiker_goods bg WHERE bg.goodsid IN (:goodsid)";
    
    List ids = Arrays.asList(new Integer[]{12496,12497,12498,12499});
    Map<String, List> paramMap = Collections.singletonMap("goodsid", ids);
    NamedParameterJdbcTemplate template = 
        new NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource());
    
    List<Long> list = template.queryForList(sql, paramMap, Long.class);
    
        3
  •  16
  •   sampathsris Rihards Fridrihsons    11 年前

    如果您得到一个异常:列类型无效

    请使用 getNamedParameterJdbcTemplate() 而不是 getJdbcTemplate()

     List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
     getRowMapper());
    

    注意,后面两个参数交换了。

        4
  •  1
  •   Roland Weisleder    7 年前

    参照 here

    使用命名参数编写查询,使用简单的 ListPreparedStatementSetter 所有参数按顺序排列。只需添加以下代码片段,即可将传统形式的查询转换为可用参数,

    ParsedSql parsedSql = NamedParameterUtils.parseSqlStatement(namedSql);
    
        List<Integer> parameters = new ArrayList<Integer>();
        for (A a : paramBeans)
            parameters.add(a.getId());
    
        MapSqlParameterSource parameterSource = new MapSqlParameterSource();
        parameterSource.addValue("placeholder1", parameters);
        // create SQL with ?'s
        String sql = NamedParameterUtils.substituteNamedParameters(parsedSql, parameterSource);
    
        return sql;
    
        5
  •  -4
  •   luso    9 年前

    自2009年以来,很多事情都发生了变化,但我只能找到一些答案,说您需要使用namedparametersjdbctemplate。

    对我来说,只要我做一个

    db.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
    

    使用SimpleJDBCTemplate或JDBCTemplate