我目前正在使用 JPA(Eclipse 链接)批处理查询从数据库中读取对象。每个对象都有几个子集合,也通过 JPA 反映出来。
我使用批处理查询来提供它们提供的性能,但是有一个缺点(也许可以避免,因此我的问题)。
给定以下对象定义(名称已更改以保护无辜,但结构保持不变)。
@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 是解决这个问题的答案)。
任何关于如何限制子集合查询大小的建议都会很高兴收到。
谢谢丰富