【问题标题】:Spring batch Item reading春季批处理Item读取
【发布时间】:2020-05-22 11:48:53
【问题描述】:

我正在使用 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


    【解决方案1】:

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

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

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

    改成:

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

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

    【讨论】:

    • 在这种情况下,我是从数据库中的表中提取所有内容吗?我需要的是我希望从表中提取特定字段,不确定如何完成以及如何完成,以及我需要做一些内部连接,所以基本上我需要从不同的表中创建一个对象,然后将其插入一张表@KenChan
    • 有人可以提供进一步的帮助吗?@MahmoudBenHassine
    • 考虑更改为使用 JDBC(即 JdbcPagingItemReader)手动定义原生 SQL 并将结果集手动映射到所需的 java 对象。另一方面,继续使用JpaPagingItemReader,但插入ItemProcessorObject[] 转换为所需的java 对象。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2018-05-27
    • 2015-05-13
    • 2017-06-25
    • 2017-10-06
    • 2018-10-04
    • 2021-06-21
    • 1970-01-01
    相关资源
    最近更新 更多