我目前正在使用 JPA(Eclipse 链接)批量查询从数据库中读取一个对象。每个对象都有几个子集合,也通过 JPA 反射(reflect)出来。
我使用批量查询来获得它们提供的性能,但是有一个缺点(也许是可以避免的,因此我的问题)。
给定以下对象定义(已更改名称以保护无辜者,但结构保持不变)。
@Entity
@Table(name = "TBL_ITEMX")
class ItemX
{
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
@BatchFetch(value = BatchFetchType.JOIN)
private Collection<SubItem1> subItem1;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
@BatchFetch(value = BatchFetchType.JOIN)
private Collection<SubItem2> subItem2;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_NO", referencedColumnName = "ID_NO")
@BatchFetch(value = BatchFetchType.JOIN)
private Collection<SubItem3> subItem3;
... getters/setters
}
如果我用 setFirstResult 和 setMaxResult 限制查询范围,例如
String qs = "select p from ItemX p";
Query qb = em.createQuery(qs);
qb.setFirstResult(0);
qb.setMaxResults(100);
这表明我只需要数据库中的前 100 个 ItemX 条目,记住每个 ItemX 都有几个集合。该查询确实将 ItemX 限制在 0 到 100 之间。但是,当 EntityManager 处理集合时,它会将每个集合的每个数据库行加载到内存中(在客户端上)。
有没有办法限制这种行为,以便批量查询只为每个需要的集合提取项目。或者要求数据库将结果查询留在服务器上并提供可滚动的结果窗口? (我试过可滚动的结果但没有帮助)。
目前我可以处理查询,但随着我们添加更多的集合和数据,查询将破坏 JVM(我真的不认为 64 位 JVM 是解决这个问题的答案)。
我们很乐意收到有关如何限制子集合查询大小的任何建议。
谢谢 丰富
最佳答案
如果你想将它与分页一起使用,你需要使用 IN 批量获取类型。
关于java - 如何限制 JPA Batch 查询的内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11154237/