3

我一直使用 JPA 2.0 和 hibernate 作为我的 Web 应用程序的供应商。对于其中一个数据库查询,我使用 JPA 标准构建器 API 来构造动态查询。我已经能够让它按预期工作。

该查询在两个表 A 和 B 之间有一个 fetch 连接。A 与 B 具有 OneToMany 关系。

Join<A,B> ordLeg = ord.joinSet("bLegs", JoinType.INNER);
ord.fetch("bLegs",JoinType.INNER);

我还使用 setMaxResults 来限制编号。返回给用户的记录

typedQuery.setMaxResults(10);

仅供参考,数据库中有大约 400 条记录。

当我在日志中看到查询结果时,我看到它加载了内存中的所有 400 条记录。但是,由于设置了 Maxresults,它只向用户返回 20 条记录。

进一步分析,发现hibernate有提示可以批量获取记录,而不是加载内存中的所有400条记录。

TypedQuery<A> typedQuery = entityManager.createQuery(query);
typedQuery.setHint("org.hibernate.fetchSize", 5);
List<A> orderList = (List<A>) typedQuery.getResultList();

但它似乎根本没有得到暗示。我仍然看到它在内存中加载了所有 400 条记录,并且没有完成批量提取。我期待它以 2 批 5 条获取 10 条(maxResults)记录。我错过了什么吗?\

如果指定查询的数据库中有超过 1000 条记录,这将严重影响性能。

我什至尝试在 persistence.xml 级别设置以下属性,但徒劳无功。

<properties>
<property name="hibernate.jdbc.batch_size" value="5"/>  
<property name="hibernate.jdbc.fetch_size" value="5">
</properties>

你能在正确的方向上帮助我吗?

休眠版本:我试过 3.6.4.Final、4.0.0.Final 和 4.2.1.Final

感谢你的帮助。

谢谢, 桑托什

4

1 回答 1

1

由于连接,maxresults 可能无法按预期工作。假设每个用户有 10 个地址,并且您希望有 10 个用户,因此 db 查询应该为您提供 10x10=100 条记录,那么 jpa 必须将用户放在一个对象中,其中包含 10 个地址列表作为集合。因此您会看到结果集和返回的最终对象存在差异。fetch size 将告诉 jpa 仅通过 jdbc 调用来获取这些记录。提取大小越小,jpa 对 db 的调用次数就越多。如果查询不是很重,请尝试增加您的 fetch 大小,在 400 条记录的情况下,使用一个内部连接,您可以轻松地使用更高的 fetch size 值。

于 2013-08-20T05:54:19.663 回答