Domanda

Mi chiedevo se esiste un modo più elegante per fare IN () query con JDBCTemplate di primavera. Attualmente faccio qualcosa di simile:

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());
}

Il che è molto doloroso perché se ho nove linee solo per costruire la clausola per la query IN (). Mi piacerebbe avere qualcosa di simile al parametro di sostituzione dei prepared statement

È stato utile?

Soluzione

Si desidera una fonte di parametri:

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

Questo funziona solo se getJdbcTemplate() restituisce un'istanza di tipo NamedParameterJdbcTemplate

Altri suggerimenti

faccio la query "nella clausola" con JDBC primavera come questo:

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);

Se si ottiene un'eccezione per: Tipo di colonna non valido

Si prega di utilizzare getNamedParameterJdbcTemplate() invece di getJdbcTemplate()

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

Si noti che le seconde due argomenti sono scambiati intorno.

Fare riferimento a qui

query di scrittura con il parametro di nome, utilizzare semplici ListPreparedStatementSetter con tutti i parametri in sequenza. Basta aggiungere sotto frammento di convertire l'interrogazione in forma tradizionale a base di parametri disponibili,

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;

Molte cose sono cambiate dal 2009, ma è possibile trovare solo risposte dicendo è necessario utilizzare NamedParametersJDBCTemplate.

Per me funziona se mi limito a fare un

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

utilizzando SimpleJDBCTemplate o JDBCTemplate

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top