Я хочу установить fetchSize только для одного запроса и не могу найти для этого подходящий API.
мой код выглядит так:
jdbcTemplate.query(query, new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {...}
);
Как я могу передать fetchSize в запрос?




Это можно сделать с помощью PreparedStatementSetter (JavaDoc)
Учитывая запрос
select * from mytable where user_id > ?
Вы можете использовать
jdbcTemplate.query(query,
new PreparedStatementSetter() {
@Override
public void setValues(final PreparedStatement ps) throws SQLException {
ps.setInt(1, userId);
ps.setFetchSize(500);
}
},
new RowCallbackHandler() {
@Override
public void processRow(final ResultSet rs) throws SQLException {
...
}
});
Или в более компактной форме
jdbcTemplate.query(
query,
ps -> {
ps.setInt(1, userId);
ps.setFetchSize(500);
},
rs -> { ... }
);
Имейте в виду, что
Implementations are responsible for setting any necessary parameters.
SQL with placeholders will already have been supplied.
Для одного результирующего объекта используйте
public <T> T query(String sql,
PreparedStatementSetter pss,
ResultSetExtractor<T> rse) throws DataAccessException;
метод. Например
jdbcTemplate.query(
query,
new ArgumentPreparedStatementSetter(new Object[] {balanceId}),
rs -> {
final String field1 = rs.getString("field1");
// Get other fields and construct the resulting object
return new YourClass(field1, ...);
}
);
@gstackoverflow Дело в том, что я никогда не видел учебника, в котором он используется. Вот почему он так «спрятан» внутри документации.
@gstackoverflow кстати, помните, что вам нужно устанавливать значения вручную.
что ты имеешь в виду?
@gstackoverflow, например, если у вас есть заполнитель в предложении «где», вам нужно вручную установить его значение, используя переменную «ps», которую дает вам Spring. Это компромисс. Ответ обновлен
@gstackoverflow, как вы теперь передаете этот аргумент методу запроса? Кажется, это не так.
Я использовал другой метод: jdbcTemplate.queryForObject("SELECT * FROM table_name WHERE id =?", new Object[]{balanceId}, MyTableMapper.INSTANCE);
@gstackoverflow хорошо, позвольте мне дать обновленный ответ.
Я пробую новый ArgumentPreparedStatementSetter (новый объект [] {id}) {...} вместо новый PreparedStatementSetter
@gstackoverflow мне кажется нормальным! Однако вам также следует переключиться с RowCallbackHandler на ResultSetExtractor, поскольку вы имеете дело с одной строкой.
@gstackoverflow это правильный метод запроса для использования docs.spring.io/spring-framework/docs/current/javadoc-api/org/…
к сожалению, это не работает. Мне нужен RowCallbackHandler, потому что мой выбор может вернуть миллионы строк
@gstackoverflow, что ты имеешь в виду? я все еще редактирую
я о своем предложении
@gstackoverflow, но queryForObject возвращает только один, вы уверены, что используете его сейчас? Я говорю это, потому что вы написали: «Я использовал другой метод: queryForObject». Так что я немного потерялся сейчас
Я просто хотел показать пример API, который я использую. на самом деле я использовал this.jdbcTemplate.query("SELECT * FROM my_table WHERE time> ? AND color =?", new Object[]{date, color}, MyTableMapper.INSTANCE )
@gstackoverflow ааа ладно!
Ваш совет ps.setInt(1, userId) мне полезен. Спасибо за ваши усилия
Это выглядит идеально!