当前位置: 首页 > 知识库问答 >
问题:

JPA Hibernate fetchSize查询提示问题

戚俊健
2023-03-14

我一直在使用带有hibernate的JPA 2.0作为我的网络应用程序的供应商。对于其中一个数据库查询,我使用JPA标准生成器API来构造动态查询。我已经能够让它像预期的那样工作了。

查询在两个表A之间有一个读取连接

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条记录,则会严重影响性能。

我甚至尝试在持久性中设置以下属性。xml级别,但这是徒劳的。

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

你能帮我找到正确的方向吗?

Hibernate版本:我试过3.6.4。决赛,4.0.0。最终的

谢谢你的帮助。

谢谢,桑索什

共有1个答案

向嘉誉
2023-03-14

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

 类似资料:
  • 当我不向其添加某些脚本但它失败并返回时,函数脚本查询工作正常 工作查询: 查询返回错误的次数最多: 任何形式的帮助都是非常感激的。 [在此处输入图像描述][1] 谢谢// [1]:https://i.stack.imgur.com/8LMRj.png**strong文本**

  • 问题内容: 我一直在努力寻找可以通过JPA中的方法调用设置的所有提示的权威资源,但我的想法是空的。有人知道很好的参考吗? 问题答案: 请参阅“ 3.4.1.7。查询提示” 。

  • 我试图使用solrj构建一个solr查询。根据我对Solr-7.5.0的理解,solrj的所有库和依赖项都应该包含在我的Solr安装中。下面是我的/dist文件夹,后面是我的/dist/solrj-lib文件夹 现在,我的查询将被绑定到一个html post表单,但我想让solrj先工作。这是我全部的solrj 这将无法编译,因为它无法识别我的类(SolrClient、SolrQuery等)。我肯

  • 我使用的是Spring Data JPA 1.7.1 这里有一个例子:

  • 问题内容: 在SQL Server中,我在查询中使用了以下提示: nowlock (row level locking) updlock (prevents dirty reads) readpast(不要阻止等待行锁,请转到第一个未锁定的行) 例如 Oracle是否有等效的查询中提示? 问题答案: 等价于该子句 从11g开始,Oracle已经记录了语法,该语法等效于: 这种语法已经使用了很长时间

  • 问题内容: 我想替换为“。” 我要写入文件的字符串/双精度字符中的“,”。 使用以下Java代码 我得到以下输出 为什么不代替做应该做的事情?我希望最后两行包含一个“,”。 我是否需要做/使用其他东西?有什么建议吗? 问题答案: 您需要将新值分配回变量。