【问题标题】:Spring Boot - JPA Repository - Stream resultset thrown could not advance using next() errorSpring Boot - JPA 存储库 - 抛出的流结果集无法使用 next() 错误推进
【发布时间】:2020-11-19 09:09:15
【问题描述】:

我正在尝试从存储库流式传输数据并将其写入 servlet 输出流。流式传输时,我面临无法读取数据错误。我已经有了@Transactional 注释..

@Autowired
private MyRepository < Y > repository;

@Autowired
private Gson gson;

@Transactional(readOnly = true)
public long writeData(ServletOutputStream outputStream) {
  JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream, UTF_8));
  int count = 0;
  writer.beginArray();
  try (Stream < T > stream = repository.findAll()) {
    stream.forEach(e ->{
      gson.toJson(e, e.getClass(), writer);
      count++;
    });
  }
  writer.endArray();
  writer.flush();
  writer.close();
}

错误: org.hibernate.exception.GenericJDBCException: could not advance using next()

【问题讨论】:

    标签: spring-boot rest jpa spring-data-jpa java-stream


    【解决方案1】:

    MyRepository 在配置类中注入了 entitymanager bean。所以我能够打印存储库类中的数据。

    但是当程序控制流回到正在执行此操作的方法时,我无法这样做,因为 entitymanager 不是此类范围的一部分。

    我所做的是,将构造函数(MyRepository repo)添加到类并更新配置文件。这样就解决了问题。

    @Configuration
    @EnableTransactionManagement
    public class MyConfiguration extends ConfigurationTemplate < MyEntity > {
    
      @Autowired
      private EntityManager entityManager;
    
      @Override
      @Bean
      @Scope("prototype")
      public DataStreamWriter < MyEntity > streamWriter() {
        return new DataStreamWriter < >(myRepository());
      }
    
      @Override
      @Bean
      public MyRepository myRepository() {
        return new MyRepository < >(MyEntity.class, entityManager);
      }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 2019-05-15
      • 2021-11-07
      • 2020-08-13
      • 1970-01-01
      • 2017-10-25
      • 2017-12-03
      • 2018-08-06
      相关资源
      最近更新 更多