JPA中的setMaxResults与fetch join结合使用

时间:2015-01-30 13:00:07

标签: java sql-server jpa openjpa

在我们的应用程序中,我们有一个带有几个过滤器字段的搜索屏幕。单击搜索按钮时,将执行一个查询,该查询将获取一些结果并将其列在网格中。

可能有很多数据,因此我们希望将返回结果的数量限制为最大1000.我们使用OpenJPA将返回记录映射回我们的模型类和SQL服务器作为数据库引擎。有一段时间我使用此代码限制了返回结果的数量:

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

这很有用,直到我最近在原始查询中添加了几个连接。

让我们举个例子,你想得到10"联系人"。每个联系人有5个地址。当我执行以下查询时:

select c from Contact c left join fetch c.address

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

并将其限制为 10 结果,并检查针对数据库执行的查询,将其翻译为" SELECT TOP 10 FROM ..."。

这意味着10个记录,而不是10个实体。因此,在我的示例中,返回的联系人列表将包含2个带有5个地址的联系人。

因此,我想到了一个问题:如何确保返回10个实体的完整数据而不是前10个记录?

1 个答案:

答案 0 :(得分:1)

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

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