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

War es hilfreich?

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

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

mit SimpleJDBCTemplate oder JDBCTemplate

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top