Как получить тип значений из запроса JDB C? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть весеннее пакетное задание, которое принимает запрос пользователя, выполняет этот запрос, чтобы найти выбранные элементы, а затем я хочу вставить эти элементы в другую базу данных. Проблема в том, что мне нужно преобразовать элементы, такие как даты, из полученного запроса, чтобы вставить их снова. Как определить тип значений, возвращаемых из запроса?

Это то, что я использую для чтения элементов, которые работают правильно.

   @Bean("querySelectiveItems")
    @StepScope
    public JdbcCursorItemReader querySelectiveItems(@Qualifier("selectiveSourceDatabase") DataSource dataSource,
                                                    @Value("#{jobExecutionContext[" + EtlConfiguration.JOB_PARM_MIGRATION_CONFIG + "]}") MigrationDefinition migrationDefinition
    ) {
        JdbcCursorItemReader reader = new JdbcCursorItemReader<>();
        reader.setSql(migrationDefinition.getMigrations().getTable().getQuery());
        reader.setDataSource(dataSource);
        reader.setRowMapper(new ColumnMapRowMapper());
        log.info("Queried for items");
        return reader;
    }

Ниже написано, что я написал, чтобы написать в базу данных назначения. Проблема в том, что значения, которые я должен вставить, неизвестны, потому что они являются результатом пользовательского запроса. Например, если в моем операторе вставки есть тип данных, я должен иметь TO_DATE около значения даты. Есть ли способ сделать это?

    @Component
    @Lazy
    class InsertSelectedItems implements ItemWriter<Map<String, Object>> {


        private MigrationDefinition migrationDefinition;

        private JdbcTemplate destinationTemplate;

        public void setDestinationTemplate(JdbcTemplate destinationTemplate) {
            this.destinationTemplate = destinationTemplate;
        }

        public void setMigrationDefinition(MigrationDefinition migrationDefinition) {
            this.migrationDefinition = migrationDefinition;
        }

        @Override
        public void write(List<? extends Map<String, Object>> items) throws Exception {
            ArrayList<String> columns = new ArrayList<>();
            ArrayList<String> values = new ArrayList<>();
            System.out.println(items);
            for (Map<String, Object> map : items) {
                for (Map.Entry<String, Object> entry : map.entrySet()) {
                    columns.add(entry.getKey());
                    values.add(String.valueOf(entry.getValue()));
                }
            }

            String sql = String.format("%s ( %s ) VALUES ( %s ) ",
                    migrationDefinition.getMigrations().getTable().getInsert(),
                    String.join(",", columns),
                    String.join(",", values));

            log.info(sql);
            destinationTemplate.update(sql);
        }
    }
...