Вы можете рассмотреть возможность пакетной выборки для строк счета-фактуры и активную выборку для многих в одну ассоциацию, такую как Клиент.
Это не приведет вас к одному вызову БД, но если вы настроите размеры своих партий так, чтобы они слегка превышали среднее число строк каждого типа в счете, то вы можете получить по одной на каждый тип линии.
Вы также можете запросить, используя JPQL / HQL, и явно извлекать-соединять строки (, как Расс описывает ), но вы получаете больший набор результатов, чем при использовании подхода пакетной выборки:
Query query = entityManager.createQuery("select distinct invoice from Invoice as invoice "
+ "left join fetch invoice.productLines "
+ "left join fetch invoice.serviceLines "
+ "left join fetch invoice.paymentOptions");
for (Object object : query.getResultList()) {
// Code here
}
Если размер переданных необработанных данных оказывается слишком большим, вы можете явно отключить выборку, удалив «fetch» из запроса в соответствующих местах.
Обратите внимание, что существует проблема с использованием JPQL, поскольку компилятор не может проверить все имена свойств для вас, а если выборка отключена для всех ассоциаций, тогда запрос является чистой стоимостью. Вы можете начать с пакетной выборки, если производительность не является непосредственной проблемой.