【发布时间】:2020-03-11 07:29:21
【问题描述】:
下面是我的控制器
public class TestController {
@PersistenceContext
EntityManager entityManager;
@Autowired
ProductAltRepository productAltRepository;
@GetMapping("/findAll")
@Transactional(readOnly = true)
public void findAll() {
Stream<ProductAltRelEntity> productAltRelEntities = productAltRepository.findAllProductAlts();
List<ProductAltRelEntity> productAlts = Lists.newArrayList();
productAltRelEntities.forEach(x -> {
productAlts.add(x);
entityManager.detach(x);
});
}
这里是存储库
@Repository
@Transactional
public interface ProductAltRepository
extends JpaRepository<ProductAltRelEntity, Long>, JpaSpecificationExecutor<ProductAltRelEntity>{
@QueryHints(value = { @QueryHint(name = HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE),
@QueryHint(name = HINT_CACHEABLE, value = "false"), @QueryHint(name = HINT_READONLY, value = "true"), })
@Query("SELECT p FROM ProductAltRelEntity p")
public Stream<ProductAltRelEntity> findAllProductAlts();
}
要求是findAll(),分页给OOM,所以想用Stream,结果出现异常。
[WARN] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 17068, SQLState: 999992019-11-15 12:30:31.468 错误 7484 --- [nio-8082-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper:调用中的参数无效:setFetchSize [错误] org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 调用中的参数无效:setFetchSize 2019-11-15 12:30:31.793 错误 7484 --- [nio-8082-exec-1] c.s.e.d.d.e.GlobalExceptionHandler:未处理的异常: org.springframework.orm.jpa.JpaSystemException:无法使用滚动执行查询;嵌套异常是 org.hibernate.exception.GenericJDBCException:无法使用滚动执行查询 原因:org.hibernate.exception.GenericJDBCException:无法使用滚动执行查询 原因:java.sql.SQLException:调用中的参数无效:setFetchSize
【问题讨论】:
-
如果您在尝试从数据库中加载所有产品时在服务器上出现 OutOfMemoryException,您认为当客户端尝试将它们全部显示时会发生什么?不要试图一次显示整个数据库。看看 Google 是如何工作的:尽管它有数百万个结果,但它只获取并显示几个结果,并且允许您根据需要获取下一页。
-
我不会显示任何内容,只是我需要获取整个数据并导出到 csv 或 xlsx 文件。我发现了一些东西blog.madadipouya.com/2019/03/26/…
-
好吧,显然,您尝试为获取大小设置的值对您的数据库无效。使用有效值。
-
知道了。我会试试的。
标签: java spring-boot java-8 spring-data-jpa java-stream