当前位置: 首页 > 知识库问答 >
问题:

Spring批处理项目读取

贺山
2023-03-14

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

查询返回的结果没有任何问题,但我得到了一个错误与读取器的返回,在处理器中,您可以检查我的编码和错误下面。

有谁能给我一点启示吗?为什么我不能处理结果?

        @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

共有1个答案

卜鹏
2023-03-14

因为您在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')")
 类似资料:
  • 我们使用Spring Batch进行一些处理,通过Reader读取一些ID,我们希望通过处理器将它们处理为“块”,然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方,不能为每个项目调用服务。 我看到我们可以为“块”中涉及的所有读取器-处理器-写入器创建包装器,以处理列表<>并委托给一些具体的读取器/处理器/写入器。但这对我来说并不是件好事。像这样:

  • 我有一个工作的Spring批处理程序,可以创建一个平面文件,但我希望能够将标签放入我的字段。 这是我的Pojo学生的例子 这是我的划船地图 } 以下是我的XML文件摘录: 它产生以下输出 我希望能够给每个字段加上库斯特姆前缀,我希望能够编写一个平面文件,上面写着

  • 我正在建立一个多模块的项目与Spring引导和批处理。 当前的目录结构为: 核心 网站 批处理 核心包含领域对象、存储库、服务。 web和批处理各自有自己的上下文,并用注释,我在执行时使用属性进行配置,例如 问题出现在包含核心类时,由于缺少存储库的bean定义,两个应用程序都不会启动,所以听起来组件扫描对核心模块不起作用。 我已经尝试了和),但没有成功。 有什么想法,我错过了什么,或者有没有更好的

  • 我是Spring批次的新手。我需要在spring批处理中实现的任务如下: 需要从数据库读取一些元数据。 基于此元数据,我需要读取一些文件。 经过一些处理后,需要将这些值从文件写入数据库。 我的查询如下: c.另外,基于某些条件,我可能需要调用第三组阅读器。如何在步骤中有条件地调用读取器? 谢谢你看了我的帖子。我知道它很长。非常感谢任何帮助。另外,我想一个示例代码片段会帮助我更好地理解这一点。:)

  • 每次作业运行时,都在从不断增长的现有表中读取数据。我正在寻找Spring batch中的选项,以便在每次运行调度作业时只查询新记录。 如果我读了50000条记录,下一个时间表应该从50001开始。 我的想法是将ItemReader读取的最后一条记录的id(整个读卡器输出的最后一条,而不是每个块的最后一条)保存在DB中,并在后续的作业计划中使用。我将从主表返回按id排序的数据。 我怎么知道作者最后的

  • 我是一个初学者,刚刚开始学习Spring Batch。我在这里按照这个教程创建了一个helloworld示例。当我按照教程操作时,我在尝试将导入java类时遇到了一个问题。因此我在网上搜索,发现我需要在build.gradle.中添加一些东西。问题是,即使我在build.gradle中添加了依赖项,我仍然有导入的错误消息。我正在使用EclipseJavaEE IDE 4.5.0(Mars)来完成这