Hibernate使用sql调用每一行来获取关系 - 而不是聚合到一个IN子句

时间:2016-09-22 06:49:13

标签: java hibernate

我有一个User个对象,addresses setAddress。现在让我们说我需要获取1,000,000个用户并在某个报告中显示他们的地址。

Hibernate方法是对sql表创建一个User调用,然后为每个用户再次调用Address表。结果是总共1,000,001个呼叫和长查询时间。

另一方面,如果聚合所有外键(例如User_Id)并运行IN sql调用

FROM Address where User_Id IN (,,,,,,,,)

您将呼叫次数减少到2 - 一个用户表,一个减少到地址表,以便在一次呼叫中带来所有1,000,000个所需地址。

但这需要在应用方面做一些工作。不是很多工作,只是一个for loop,但仍然。有可能让Hibernate以有效的方式去做吗?

请注意LAZY fetching与此无关。对于我的用例,我需要一个EAGER fetching

2 个答案:

答案 0 :(得分:0)

我建议您进行2次查询。我使用Java 8流。

{{1}}

另外我想建议在1个查询中不要获得1,000,000行,使用批处理。

答案 1 :(得分:0)

Hibernate将使用JOINS生成单个查询。我不知道你正在使用什么样的配置。SELECT u FROM User u LEFT JOIN FETCH u.address会通过连接给你地址。单个查询