Wie in () SQL-Abfragen mit Spring JDBCTemplate effektiv auszuführen?
-
19-09-2019 - |
Frage
Ich frage mich, ob es eine elegantere Art und Weise zu tun, IN () Abfragen mit Spring JDBCTemplate. Zur Zeit mache ich etwas wie folgt aus:
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());
}
die sehr schmerzhaft ist, da, wenn ich neun Linien haben nur für den Aufbau der Klausel für die IN () Abfrage. Ich möchte so etwas wie die Parameter Substitution von Prepared Statements haben
Lösung
Sie möchten einen Parameter Quelle:
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());
Dies funktioniert nur, wenn getJdbcTemplate()
eine Instanz vom Typ zurückgibt NamedParameterJdbcTemplate
Andere Tipps
ich tun, um die "in-Klausel" Abfrage mit Feder jdbc wie folgt aus:
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);
Wenn Sie erhalten eine Ausnahme für: Ungültige Spaltentyp
Bitte verwenden getNamedParameterJdbcTemplate()
statt getJdbcTemplate()
List<Foo> foo = getNamedParameterJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)",parameters,
getRowMapper());
Beachten Sie, dass die zweiten zwei Argumente vertauscht werden.
Siehe hier
Schreibabfrage mit dem Namen Parameter, verwenden Sie einfach ListPreparedStatementSetter
mit allen Parametern in Folge. Fügen Sie einfach unten Snippet die Abfrage in der traditionellen Form zu konvertieren basierend auf verfügbaren Parameter,
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;
Viele Dinge seit 2009 geändert, aber ich kann nur Antworten sagen, Sie brauchen NamedParametersJDBCTemplate zu verwenden.
Bei mir funktioniert es, wenn ich nur ein
tundb.query(sql, new MyRowMapper(), StringUtils.join(listeParamsForInClause, ","));
mit SimpleJDBCTemplate oder JDBCTemplate