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

如何从存储库项目读取器而不是实体 Spring 批处理返回实体列表

傅乐湛
2023-03-14

我正在使用RepositoryItemReader作为阅读器。我需要一起处理该块的整个读取器值列表。

当我试图通过扩展读取器返回列表来执行块处理时,在我的处理器中,我收到错误

类Car不能转换为java.util.list(Car位于加载程序“app”的未命名模块中);java.util.List位于加载程序“bootstrap”的java.base模块中

读者

 public class CarReader extends RepositoryItemReader<List<Car>>{
    
   @Autowired
   CarRepository carRepository;

   public CarReader(){
    super();
    this.setPageSize(100);
    this.setSort(CarSort());
    this.setRepository(carRepository);
    this.setMethodName("findAll");
    return repositoryItemReader;
  }

贮藏室ˌ仓库

public interface CarRepository extends PagingAndSortingRepository<Car,long>{
   Page<Car> findAll(Pageable pageable);
}

处理器

public class CarProcessor implements ItemProcessor<List<Car>,List<Car>>{
  @Override
  public List<Car> process(List<Car> cars){
    //prepare CarTransform
 }
}

步骤

@Bean
public Step step1() {
    return this.stepBuilderFactory.get("step1")
                .<List<Car>, List<CarTransform>>chunk(100)
                .reader(carReader)
                .processor(carProcessor)
                .writer(carWriter)
                .build();
}

共有1个答案

壤驷茂实
2023-03-14

看这个例子:https://html" target="_blank">github.com/emalock3/spring-batch-example/blob/master/src/main/java/com/github/emalock3/spring/example/BatchConfiguration.java

我不认为你应该在你的阅读器/处理器/编写器中使用列表......相反,只使用 Car 和 CarTransform 类。

Spring Batch将根据您设置的块大小处理所有分块。根据您的配置,它应该一次自动处理 100 条记录。

我认为您看到的错误是因为<code>findAll<code>方法返回了<code>页

您的步骤配置应如下所示:

@Bean
public Step step1() {
    return this.stepBuilderFactory.get("step1")
                .<Car, CarTransform>chunk(100)
                .reader(carReader)
                .processor(carProcessor)
                .writer(carWriter)
                .build();
}

读者:

public class CarReader extends RepositoryItemReader<Car> {

    @Autowired
    CarRepository carRepository;

    public CarReader() {
        super();
        this.setPageSize(100);
        this.setSort(CarSort());
        this.setRepository(carRepository);
        this.setMethodName("findAll");
    }
}

处理器:

public class CarProcessor implements ItemProcessor<Car, CarTransform> {
    @Override
    public CarTransform process(Car car) {
        // prepare CarTransform
    }
}
 类似资料:
  • 我在后端代码中使用了Spring数据jpa。我已经包含了实体,dto接口,服务和jpa存储库代码。 现在的问题是,当我在< code>TopicService中调用< code>getAllTopics()时。它返回< code>Topic对象的列表,而不是< code>TopicDto。< code>Topic对象包含一个< code >示例列表,我没有将它包含在< code>TopicDto中

  • 问题是:如何使spring批处理中的条目读取器传递列表而不是单个对象。 我已经搜索过了,一些答案是修改项目阅读器以返回对象列表,并改变项目处理器以接受列表作为输入。 如何对项目阅读器进行编码?

  • 问题内容: 我正在为我的Web应用程序使用Hibernate和Spring。 在数据库操作中,Hibernate正在缓存实体并在下一个请求中返回它们,而不读取实际的数据库。我知道这将减少数据库的负载并提高性能。 但是,尽管此应用仍在构建中,但我需要在每个请求中从数据库加载数据(测试原因)。 有什么办法可以强制数据库读取? 我确定从此log4j消息进行缓存。 问题答案: 或(如果您使用JPA)将为您

  • 我正在使用JpaPagingItemReaderBuilder查询一个DB,结果被插入到另一个DB中。 查询返回的结果没有任何问题,但我得到了一个错误与读取器的返回,在处理器中,您可以检查我的编码和错误下面。 有谁能给我一点启示吗?为什么我不能处理结果?

  • 我创建了一个基本的Spring MVC / JPA / Hibernate应用程序。我试图保存一个UserProfile实体来测试我是否真的可以持久化它,但是什么也没有保存,也没有抛出异常。 在控制器方法中,我创建了一个简单的UserProfile(这是一个@Entity),并将其发送到服务方法。类使用 @Service 对类进行批注,并使用 @Transactional 对 addUserPro

  • 我正在编写一个spring批处理作业,在其中一个步骤中,我为处理器编写了以下代码: null 欢迎任何暗示。