Spring Batch: ошибки форматирования JdbcCursorItemReader с использованием нескольких параметров - PullRequest
0 голосов
/ 04 октября 2019

У меня есть задание, которое просто должно считывать некоторые данные из таблицы postgres, используя несколько (неизвестное количество) параметров. Начиная с самой последней итерации, я настроил что-то вроде этого.

@Bean
@StepScope
public ArgumentPreparedStatementSetter paramSetter(@Value("#{jobParameters['vendorNumbers']}") String vendorNumbers) {
    return new ArgumentPreparedStatementSetter(new Object[]{vendorNumbers});
}

@Bean
@StepScope
public JdbcCursorItemReader<PurchaseOrder> purchaseOrderReaderCursor(DataSource dataSource) {

    return new JdbcCursorItemReaderBuilder<PurchaseOrder>()
            .name("purchaseOrderReaderCursor")
            .dataSource(dataSource)
            .rowMapper(new PurchaseOrderMapper())
            .sql("select * from mytable where vendor_number = ANY (string_to_array(?, ',') ) ")
            .preparedStatementSetter(paramSetter(null))
            .build();

}

Где vendorNumbers - строка разделенных запятыми номеров отдельных поставщиков. В конечном итоге они должны быть отдельными значениями параметров, которые должны быть помещены в предложение where

, которое выдает эту ошибку

org.springframework.dao.DataIntegrityViolationException: Attempt to process next row failed; SQL [select * from public.sep_ship_by_date_staging where vendor_number = ANY (string_to_array(?, ',') ) ]; The column index is out of range: 0, number of columns: 10.; nested exception is org.postgresql.util.PSQLException: The column index is out of range: 0, number of columns: 10.

Нужно ли добавлять заполнитель? для каждого параметра?

Я пытался использовать Paging Reader вместо Cursor, я пытался передать массив в качестве аргументов параметров вместо строк, и я пробовал около ста различных комбинаций вещей междуи не могу понять это правильно. Существует ли элегантный способ передачи нескольких параметров в простой запрос на выборку в весеннем пакете? Также есть ли способ просмотреть или зарегистрировать запрос, который фактически отправляется в БД?

Мне просто нужен результирующий запрос, который выглядит так, как будто он передается в db

SELECT * FROM mytable WHERE vendor_number in ('111', '222', '333', '444')

, который содержит точные пользовательские значения.

Я застрял на этомв течение нескольких дней, поэтому любая помощь будет вознаграждена огромным количеством интернет-очков!

...