@BatchFetch введите JOIN

Меня смущает эта аннотация для поля объекта, имеющая тип другого объекта:

@BatchFetch(value = BatchFetchType.JOIN)

В документах EclipseLink для BatchFetch это объясняется следующим образом:

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 не выполняет объединение в тот момент, когда он извлекает список записей, связанных с сотрудником? Записи типа адреса/телефона извлекаются с использованием внешнего ключа, так что это само соединение, верно? Тип BatchFetch является необязательным параметром, и для соединения указывается:

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

что это значит? Разве пакетный запрос не является соединением?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
589
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Присоединение к отношению и возврат данных, на которые ссылаются, вместе с основными данными — это соединение по выборке. Таким образом, запрос, который возвращает 1 сотрудника с 5 телефонами, приводит к возврату 5 строк, при этом данные в Employee дублируются для строки охвата. Когда это менее идеально, скажем, запрос более 1000 сотрудников, вы прибегаете к отдельному пакетному запросу для этих телефонных номеров. Такой запрос будет выполняться один раз, чтобы вернуть 1000 строк сотрудников, а затем запустить второй запрос, чтобы вернуть все телефоны сотрудников, необходимые для создания считывания сотрудников.

Затем три типа пакетных запросов, перечисленные здесь, определяют, как будет построен этот второй пакетный запрос. Они будут работать по-разному в зависимости от данных и настройки базы данных.

  • ПРИСОЕДИНЯЙТЕСЬ — работает почти так же, как и присоединение к выборке, за исключением того, что оно возвращает только данные телефона.
  • EXISTS — это приводит к тому, что БД выполняет первоначальный запрос для сотрудников, но использует данные в подзапросе Exists для последующего извлечения телефонов.
  • IN — EclipseLink объединяет все идентификаторы сотрудников или значения, используемые для ссылки на телефоны, и использует их для непосредственной фильтрации телефонов.

Лучший способ выяснить это — всегда попробовать это с включенным ведением журнала SQL, чтобы увидеть, что он генерирует для вашего сопоставления и запроса. Поскольку это параметры производительности, вам следует протестировать их и записать показатели, чтобы определить, какие из них лучше всего подходят для вашего приложения по мере роста его набора данных.

Другие вопросы по теме