2

我目前正在使用 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 是解决这个问题的答案)。

任何关于如何限制子集合查询大小的建议都会很高兴收到。

谢谢丰富

4

1 回答 1

0

如果要与分页一起使用,则需要使用 IN 批量提取类型。

于 2012-06-25T14:09:26.873 回答