JPA 中的 setMaxResults 结合 fetch join

setMaxResults in JPA combined with fetch join

在我们的应用程序中,我们有一个带有几个筛选字段的搜索屏幕。当您单击搜索按钮时,将执行一个查询,获取几个结果并将它们列在网格中。

但是可能会有很多数据,因此我们希望将 returned 结果的数量限制为最多 1000 个。我们正在使用 OpenJPA 将 return 记录映射回我们的模型 类 和 SQL 服务器作为数据库引擎。一段时间以来,我使用以下代码限制了 returned 结果的数量:

return entityManager.createQuery(query).setMaxResults(1000).getResultList();

在我最近向原始查询中添加了几个联接之前,这一直很有效。

例如,假设您想获得 10 个 "Contacts"。每个联系人有 5 个地址。当我执行以下查询时:

select c from Contact c left join fetch c.address

实际执行的查询选择了 50 条记录(每个联系人 5 行,每个地址 1 行)。这是 10 个联系人。

并将其限制为 10 结果并检查针对其转换为 "SELECT TOP 10 FROM ...".

的数据库执行的查询

这转化为 10 个 记录 ,而不是 10 个实体。因此,在我的示例中,returned 联系人列表将包含 2 个联系人及其 5 个地址。

所以这让我想到了我的问题:我可以做些什么来确保 entities 的完整数据被 returned 而不是前 10 条记录?

我假设一个联系人可能没有恰好 5 个地址(因为如果这是真的,那么答案将是微不足道的)。

您在 SQL(据我所知,尽管您应该检查您的供应商的文档)或 JPQL 中都没有可以进行查询以执行您想要的操作的查询构造。因此,您唯一的选择是从数据库中获取一个页面,就像您现在正在做的那样,然后计算返回的联系人数量,如果您需要更多,则获取下一页,依此类推,直到您有足够的联系人。为此,您可以使用 setFirstResult 和 setMaxResults。