我一直在使用JPA 2.0和hibernate作为我的Web应用程序的供应商。对于其中一个数据库查询,我使用JPA条件构建器API来构造动态查询。我已经能够按预期工作了。
查询在两个表A和A之间具有提取连接。 B. A与B有一个OneToMany关系。
Join<A,B> ordLeg = ord.joinSet("bLegs", JoinType.INNER);
ord.fetch("bLegs",JoinType.INNER);
我也使用了setMaxResults来限制no。记录返回给用户
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&amp; 4.2.1.Final
感谢您的帮助。
谢谢, Santhosh
答案 0 :(得分:1)
由于连接,maxresults可能无法按预期工作。假设每个用户有10个地址,并且您期望10个用户,因此db query应该为您提供10x10 = 100个记录,然后jpa必须将用户放在一个包含10个地址列表的对象中作为集合。因此,您会看到结果集和返回的最终对象存在差异。 获取大小将告诉jpa仅通过jdbc调用获取那些记录。获取大小越小,jpa对db返回的调用次数越多。 如果查询不是很大,尝试增加你的提取大小,在400个记录的情况下,使用一个内连接,你可以轻松地使用更高的提取大小值。