Проблема, как другие более элегантно заявили, заключается в том, что у вас либо декартово произведение столбцов OneToMany, либо вы выполняете N + 1 выбор. Возможен либо гигантский набор результатов, либо общение с базой данных соответственно.
Я удивлен, что это не упоминается, но вот как я обошел эту проблему ... Я делаю таблицу временных кодов . Я также делаю это, когда у вас есть ограничение IN ()
.
Это не работает для всех случаев (возможно, даже не для большинства), но особенно хорошо работает, если у вас много дочерних объектов, таких, что декартово произведение выйдет из-под контроля (то есть, множество OneToMany
столбцов число результатов будет умножением столбцов) и его больше, как пакетное задание.
Сначала вы вставляете идентификаторы родительского объекта в виде пакета в таблицу идентификаторов.
Этот batch_id - это то, что мы генерируем в нашем приложении и удерживаем.
INSERT INTO temp_ids
(product_id, batch_id)
(SELECT p.product_id, ?
FROM product p ORDER BY p.product_id
LIMIT ? OFFSET ?);
Теперь для каждого столбца OneToMany
вы просто делаете SELECT
для таблицы идентификаторов INNER JOIN
, используя дочернюю таблицу с WHERE batch_id=
(или наоборот). Вы просто хотите убедиться, что вы упорядочили по столбцу id, поскольку это упростит объединение столбцов результатов (в противном случае вам понадобится HashMap / Table для всего набора результатов, что может быть не так уж плохо).
Тогда вы просто периодически очищаете таблицу идентификаторов.
Это также работает особенно хорошо, если пользователь выбирает, скажем, около 100 различных элементов для какой-либо массовой обработки. Поместите 100 различных идентификаторов во временную таблицу.
Теперь количество запросов, которые вы делаете, зависит от количества столбцов OneToMany.