Jak skutecznie wykonywać w() zapytania SQL z jdbctemplate Springa?

Zastanawiałem się, czy jest bardziej elegancki sposób na wykonywanie zapytań() z jdbctemplate Springa. Obecnie robię coś takiego:

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

Co jest dość bolesne, ponieważ jeśli mam dziewięć linii tylko do budowania klauzuli dla zapytania IN (). Chciałbym mieć coś takiego jak substytucja parametru przygotowanych wyrażeń

Author: ROMANIA_engineer, 2009-08-25

5 answers

Chcesz mieć źródło parametru:

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

To działa tylko wtedy, gdy getJdbcTemplate() zwróci instancję typu NamedParameterJdbcTemplate

 278
Author: yawn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-03 10:34:57

Wykonuję zapytanie "in clause" Z spring jdbc w następujący sposób:

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);
 62
Author: Mr Lou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 16:21:59

Jeśli otrzymasz wyjątek dla: Invalid column type

Proszę użyć getNamedParameterJdbcTemplate() zamiast getJdbcTemplate()

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

Zauważ, że dwa drugie argumenty są zamieniane.

 19
Author: Mahmood Omari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-30 02:13:17

Zobacz tutaj

Napisz zapytanie z podanym parametrem, użyj prostego {[1] } ze wszystkimi parametrami w kolejności. Wystarczy dodać poniższy fragment, aby przekonwertować zapytanie w tradycyjnej formie na podstawie dostępnych parametrów,

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;
 2
Author: Abhishek Chatterjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-10 16:57:35

Wiele rzeczy zmieniło się od 2009 roku, ale mogę tylko znaleźć odpowiedzi mówiące, że musisz użyć NamedParametersJDBCTemplate.

Dla mnie to działa, jeśli po prostu zrobić

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

Używanie SimpleJDBCTemplate lub JDBCTemplate

 -4
Author: luso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-30 09:29:21