spring-batch - 春季批处理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
解决方案
由于您在 中配置以下查询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)并应该解决您的问题。
推荐阅读
- javascript - 为什么这个不变的变量会在同一个函数中改变值?(是因为缓存吗?)
- mocking - 扩展 Jest 的“自动模拟”功能
- node.js - Error After Trying to Update to Latest NPM Version
- javascript - JavaScript onclick works in browsers, not in Android WebView
- groovy - Compilation fails for Repast ReLogo code in groovy
- javascript - How can I pass data to a component without props in React?
- php - Doctrine Inheritance: Discriminator from Entity attribute and not table column?
- ios - 如何指定要打开的模拟器
- java - spring field service 需要一个 bean 类型
- wordpress - 无法在 Google Cloud Compute Engine 上获得 SSL 配置