Come eseguire IN) query SQL (con JDBCTemplate di primavera in modo efficace?
-
19-09-2019 - |
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
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