首页 > 解决方案 > 春季批处理Item读取

问题描述

我正在使用 JpaPagingItemReaderBuilder 查询数据库,结果被插入到另一个数据库中。

查询返回结果没有问题,但我收到阅读器返回错误,在处理器中,您可以在下面检查我的编码和错误。

有人可以给我一些见解吗?为什么我无法处理结果?

这是我的代码:

        @Bean
        public Step sampleStep(){

            return stepBuilderFactory.get("sampleStep")
                    .<FCR_HDR,FCR_HDR>chunk(5)
                    .reader(itemReader())
                    .processor(processor())
                    //.writer(i -> i.stream().forEach(j -> System.out.println(j)))
                    //.writer(i -> i.forEach(j -> System.out.println(j)))
                    .writer(jpaItemWriter())
                    .build();
        }

        @Bean
        public Job sampleJob(){
            return jobBuilderFactory.get("sampleJob")
                    .incrementer(new RunIdIncrementer())
                    .start(sampleStep())
                    .build();
        }

        @Bean
        public FcrItemProcessor processor() {
            return new FcrItemProcessor();
        }
        @Bean
        @StepScope
        public JpaPagingItemReader<FCR_HDR> itemReader(/*@Value("${query}") String query*/){

            return new JpaPagingItemReaderBuilder<FCR_HDR>()
                    .name("db2Reader")
                    .entityManagerFactory(localContainerEntityManagerFactoryBean.getObject())
                    .queryString("select f.fcr_ref,f.num_subbills from FCR_HDR f where f.fcr_ref in ('R2G0130185','R2G0128330')")
                    //.queryString(qry)
                    .pageSize(3)
                    .build();
        }


        @Bean
        @StepScope
        public JpaItemWriter jpaItemWriter(){
            JpaItemWriter writer = new JpaItemWriter();
            writer.setEntityManagerFactory(emf);
            return writer;

        }


    }

    public class FcrItemProcessor implements ItemProcessor<FCR_HDR,FCR_HDR> {

    private static final Logger log = LoggerFactory.getLogger(FcrItemProcessor.class);

    @Nullable
    @Override
    public FCR_HDR process(FCR_HDR fcr_hdr) throws Exception {
        final String fcrNo = fcr_hdr.getFcr_ref();
        final String numsubbills = fcr_hdr.getNum_subbills();

        final FCR_HDR transformFcr = new FCR_HDR();

        transformFcr.setFcr_ref(fcrNo);
        transformFcr.setNum_subbills(numsubbills);

        log.info("Converting (" + fcr_hdr + ") into (" + transformFcr + ")");

        return transformFcr;
    }
    }

错误:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.electronicfcr.efcr.model.FCR_HDR

标签: spring-batch

解决方案


由于您在 中配置以下查询JpaPagingItemReader

.queryString("select f.fcr_ref,f.num_subbills from FCR_HDR f where f.fcr_ref in ('R2G0130185','R2G0128330')")

查询的格式JPQL将由 JPA 处理,Object[]如果您从映射实体中选择某些映射列,JPA 将返回 a。

将其更改为:

.queryString("select f from FCR_HDR f where f.fcr_ref in ('R2G0130185','R2G0128330')")

这样它将返回映射的实体类(即 FCR_HDR)并应该解决您的问题。


推荐阅读