Лучший способ для ИМО - использовать атрибут batch-size
в ваших коллекциях.
Я предполагаю, что ваш класс FormProfile имеет коллекцию FieldGroups , которая имеет коллекцию FormFields , которая имеет FieldProperties коллекция.
Установите для batch-size
разумное число (скажем, 20), которое будет number of collections
для запроса сразу.
Таким образом, когда вы получаете и перемещаетесь по FormProfile, у вас будет только 3 дополнительных запроса (по одному для каждого типа коллекции). Эти запросы являются небольшими и быстрыми (они бьют только по одной таблице каждый и будут использовать поиск по индексу FK, если вы его определили), что обычно лучше, чем наличие большого денормализованного запроса.
Вы также можете включить кэширование второго уровня для сущностей и коллекций для еще большей производительности.