@BatchFetch 类型 JOIN

@BatchFetch type JOIN

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

@BatchFetch(value = BatchFetchType.JOIN)

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

For example, consider an object with an EMPLOYEE and PHONE table in which PHONE has a foreign key to EMPLOYEE. By default, reading a list of employees' addresses by default requires n queries, for each employee's address. With batch fetching, you use one query for all the addresses.

但我对指定 BatchFetchType.JOIN 的含义感到困惑。我的意思是,当 BatchFetch 检索与员工关联的记录列表时,它不会进行连接吗? address/phone 类型的记录是使用外键检索的,所以它本身就是一个连接,对吗?
BatchFetch 类型是可选参数,对于 join 表示:

JOIN – The original query's selection criteria is joined with the batch query

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

加入关系并return将引用数据与主要数据合并是一个提取连接。因此,引入 1 个具有 5 phones 的员工的查询会导致 5 行被 returned,并且 Employee 中的数据被复制以用于到达行。如果不太理想,比如查询超过 1000 名员工,您可以对这些 phone 个数字求助于单独的批量查询。这样的查询将 运行 一次 return 1000 名员工行,然后 运行 第二次查询 return 所有员工 phone 需要构建读入雇员。

列出的三种批处理查询类型 here 然后决定如何构建第二批查询。这些将根据数据和数据库调整执行不同的操作。

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

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