在我的生产代码中,我使用了 spring JPARepository.findAll 方法,我们怀疑它的执行之一返回了一个空列表(尽管 db 表有数据)而不是抛出一个破坏下游代码的异常。我们没有调试日志来查看实际返回的内容。 findAll 的可用文档不多。 findAll 是否有可能返回空数据(尽管数据库中存在数据)?
只需从您的 catch 块返回一个空列表:
catch (Exception e){
Log.error(e);
return new ArrayList<POJO>();
}
不确定这是否回答了您的问题,但是 Spring Data JPA findAll 方法肯定可以返回一个空列表 - 尽管如果该特定表上有数据则不会这样做。
您可以通过这种方式在代码中处理此问题:
List<Entity> entities = entityRepository.findAll();
if (entities.isEmpty()) {
// handle this use case here
}
我有一个类似的问题,其中 repository.findById(id) 会返回一个结果,而 repository.findAll() 会返回空。 问题是我用 @Transactional(readOnly = true) 包装了调用方方法,该方法将写入然后读取所有记录:
@Override
@Transactional(readOnly = true)
public List<Object> writeThenReadAll(...){
repository.save(...);
...
Object byId = repository.findById(1L).get(); //return record
List<Object> all = repository.findAll(); //empty List
return all;
}
将 @Transactional(readOnly = true) 更改为 @Transactional(readOnly = false) 解决了这个问题。
我在使用 JPARepository 时遇到了同样的问题,我的问题通过 在您调用此方法的位置使用控制器内部的@Autowired 注释。