假设我有一个包含数百万行的表。使用 JPA,迭代针对该表的查询的正确方法是什么,这样 我就没有包含数百万个对象的所有内存列表?
例如,我怀疑如果表很大,以下内容会爆炸:
List<Model> models = entityManager().createQuery("from Model m", Model.class).getResultList();
for (Model model : models)
{
System.out.println(model.getId());
}
分页(循环和手动更新 setFirstResult()
/ setMaxResult()
)真的是最好的解决方案吗?
编辑:我针对的主要用例是一种批处理作业。如果运行时间长一点就好了。不涉及网络客户端;我只需要为每一行“做某事”,一次一个(或一些小的 N)。我只是想避免同时将它们全部存储在内存中。
原文由 George Armhold 发布,翻译遵循 CC BY-SA 4.0 许可协议
Java Persistence with Hibernate 的第 537 页给出了一个使用
ScrollableResults
的解决方案,但可惜它仅适用于 Hibernate。所以似乎使用
setFirstResult
/setMaxResults
和手动迭代确实是必要的。这是我使用 JPA 的解决方案:然后,像这样使用它: