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