我一直使用 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
感谢你的帮助。
谢谢, 桑托什