0

对于属于另一个实体类型的实体字段,我对此注释感到困惑:

@BatchFetch(value = BatchFetchType.JOIN)

在 EclipseLink for BatchFetch 的文档中,他们解释如下:

例如,考虑具有 EMPLOYEE 和 PHONE 表的对象,其中 PHONE 具有指向 EMPLOYEE 的外键。默认情况下,读取员工地址列表默认需要 n 次查询,针对每个员工的地址。通过批量提取,您可以对所有地址使用一个查询。

但我对指定的含义感到困惑BatchFetchType.JOIN。我的意思是,BatchFetch 在检索与员工关联的记录列表时不会加入吗?地址/电话类型的记录是使用外键检索的,所以它本身就是一个连接,对吧?
BatchFetch 类型是一个可选参数,对于 join 来说:

JOIN – 原始查询的选择条件与批处理查询连接

这是什么意思?批量查询不是连接本身吗?

4

1 回答 1

0

加入关系并将引用的数据与主要数据一起返回是 fetch join。因此,一个包含 5 个电话的 1 个 Employee 的查询会导致返回 5 行,其中 Employee 中的数据被复制到到达行。当这不太理想时,比如查询超过 1000 名员工,您可以对这些电话号码进行单独的批量查询。这样的查询将运行一次以返回 1000 个员工行,然后运行第二个查询以返回构建读取员工所需的所有员工电话。

然后,此处列出的三种批处理查询类型确定了第二个批处理查询的构建方式。这些将根据数据和数据库调整以不同的方式执行。

  • JOIN - 与 fetch join 的工作方式大致相同,只是它只返回 Phone 数据。
  • EXISTS - 这会导致数据库对员工执行初始查询,但使用 Exists 子查询中的数据然后获取电话。
  • IN - EclipseLink 聚合所有用于引用电话的员工 ID 或值,并使用它们直接过滤电话。

找出答案的最佳方法是始终在打开 SQL 日志记录的情况下进行尝试,以查看它为您的映射和查询生成了什么。由于这些是性能选项,因此您应该对其进行测试并记录指标,以确定随着数据集的增长哪个最适合您的应用程序。

于 2019-05-30T16:05:25.803 回答