【发布时间】:2013-08-20 01:59:53
【问题描述】:
我一直使用 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>
你能帮我找出正确的方向吗?
Hibernate 版本:我试过 3.6.4.Final、4.0.0.Final 和 4.2.1.Final
感谢您的帮助。
谢谢, 桑托什
【问题讨论】: