Как установить fetchSize для конкретного запроса?

Я хочу установить fetchSize только для одного запроса и не могу найти для этого подходящий API.

мой код выглядит так:

jdbcTemplate.query(query, new RowCallbackHandler() {
            @Override
            public void processRow(ResultSet rs) throws SQLException {...}
);

Как я могу передать fetchSize в запрос?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
409
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это можно сделать с помощью 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 23.03.2019 22:08

@gstackoverflow Дело в том, что я никогда не видел учебника, в котором он используется. Вот почему он так «спрятан» внутри документации.

LppEdd 23.03.2019 22:09

@gstackoverflow кстати, помните, что вам нужно устанавливать значения вручную.

LppEdd 23.03.2019 22:14

что ты имеешь в виду?

gstackoverflow 23.03.2019 22:15

@gstackoverflow, например, если у вас есть заполнитель в предложении «где», вам нужно вручную установить его значение, используя переменную «ps», которую дает вам Spring. Это компромисс. Ответ обновлен

LppEdd 23.03.2019 22:17

@gstackoverflow, как вы теперь передаете этот аргумент методу запроса? Кажется, это не так.

LppEdd 23.03.2019 22:22

Я использовал другой метод: jdbcTemplate.queryForObject("SELECT * FROM table_name WHERE id =?", new Object[]{balanceId}, MyTableMapper.INSTANCE);

gstackoverflow 23.03.2019 22:27

@gstackoverflow хорошо, позвольте мне дать обновленный ответ.

LppEdd 23.03.2019 22:28

Я пробую новый ArgumentPreparedStatementSetter (новый объект [] {id}) {...} вместо новый PreparedStatementSetter

gstackoverflow 23.03.2019 22:33

@gstackoverflow мне кажется нормальным! Однако вам также следует переключиться с RowCallbackHandler на ResultSetExtractor, поскольку вы имеете дело с одной строкой.

LppEdd 23.03.2019 22:35

@gstackoverflow это правильный метод запроса для использования docs.spring.io/spring-framework/docs/current/javadoc-api/org‌​/…

LppEdd 23.03.2019 22:36

к сожалению, это не работает. Мне нужен RowCallbackHandler, потому что мой выбор может вернуть миллионы строк

gstackoverflow 23.03.2019 22:38

@gstackoverflow, что ты имеешь в виду? я все еще редактирую

LppEdd 23.03.2019 22:39

я о своем предложении

gstackoverflow 23.03.2019 22:40

@gstackoverflow, но queryForObject возвращает только один, вы уверены, что используете его сейчас? Я говорю это, потому что вы написали: «Я использовал другой метод: queryForObject». Так что я немного потерялся сейчас

LppEdd 23.03.2019 22:42

Я просто хотел показать пример API, который я использую. на самом деле я использовал this.jdbcTemplate.query("SELECT * FROM my_table WHERE time> ? AND color =?", new Object[]{date, color}, MyTableMapper.INSTANCE )

gstackoverflow 23.03.2019 22:45

@gstackoverflow ааа ладно!

LppEdd 23.03.2019 22:45

Ваш совет ps.setInt(1, userId) мне полезен. Спасибо за ваши усилия

gstackoverflow 23.03.2019 22:47

Другие вопросы по теме