Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA Hibernate fetchSize查询提示问题_Java_Oracle_Hibernate_Jpa - Fatal编程技术网

Java JPA Hibernate fetchSize查询提示问题

Java JPA Hibernate fetchSize查询提示问题,java,oracle,hibernate,jpa,Java,Oracle,Hibernate,Jpa,我一直在使用JPA2.0和hibernate作为我的web应用程序的供应商。对于其中一个数据库查询,我使用JPA criteria builder API来构造动态查询。我已经能够让它按预期工作 查询在两个表a和B之间有一个fetch联接。a与B之间有一个OneToMany关系 Join<A,B> ordLeg = ord.joinSet("bLegs", JoinType.INNER); ord.fetch("bLegs",JoinType.INNER); 仅供参考,数据库中大约

我一直在使用JPA2.0和hibernate作为我的web应用程序的供应商。对于其中一个数据库查询,我使用JPA criteria builder API来构造动态查询。我已经能够让它按预期工作

查询在两个表a和B之间有一个fetch联接。a与B之间有一个OneToMany关系

Join<A,B> ordLeg = ord.joinSet("bLegs", JoinType.INNER);
ord.fetch("bLegs",JoinType.INNER);
仅供参考,数据库中大约有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();
TypedQuery TypedQuery=entityManager.createQuery(查询);
typedQuery.setHint(“org.hibernate.fetchSize”,5);
List orderList=(List)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

谢谢你的帮助

谢谢,
Santhosh

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

谢谢Ashish。。但maxResults的工作与预期一样。也就是说,我得到的记录和我在setMaxResults中输入的记录一样多。但是fetchSize查询提示没有效果。我将fetchSize更改为100,max results更改为200,以查看它是否以2个为一批进行获取。我能够在响应中看到200条记录(setMaxresults),但它会将所有400条记录加载到内存中。将提取大小设置为TypedQuery的一部分没有效果。
<properties>
<property name="hibernate.jdbc.batch_size" value="5"/>  
<property name="hibernate.jdbc.fetch_size" value="5">
</properties>