Как подгрузить две коллекции связанных сущностей минимальным количеством sql запросов?

Для загрузки двух коллекций связанных сущностей минимальным количеством SQL-запросов в Java, можно использовать два подхода: использование JOIN-запросов и использование выделенных SQL-запросов.

1. Использование JOIN-запросов:
В случае, если связь между сущностями в базе данных уже задана при помощи внешнего ключа, можно использовать JOIN-запросы для загрузки данных из обеих таблиц в одном запросе. Позволяет избежать необходимости дополнительных запросов на получение связанных сущностей.

Пример:

   String sqlQuery = "SELECT * FROM entity1 INNER JOIN entity2 ON entity1.id = entity2.entity1_id";
   Statement statement = connection.createStatement();
   ResultSet resultSet = statement.executeQuery(sqlQuery);
   
   List<Entity1> entity1List = new ArrayList<>();
   List<Entity2> entity2List = new ArrayList<>();
   
   while (resultSet.next()) {
       Entity1 entity1 = new Entity1();
       // заполнение полей entity1 из resultSet
       entity1List.add(entity1);
       
       Entity2 entity2 = new Entity2();
       // заполнение полей entity2 из resultSet
       entity2List.add(entity2);
   }
   
   // Добавляем связь между сущностями
   for (int i = 0; i < entity1List.size(); i++) {
       entity1List.get(i).setEntity2(entity2List.get(i));
   }

2. Использование выделенных SQL-запросов:
Если связь между сущностями не задана или требуется более сложная логика загрузки данных, можно использовать отдельные SQL-запросы для получения данных из каждой таблицы и затем объединить их в соответствии с логикой приложения.

Пример:

   String sqlQuery1 = "SELECT * FROM entity1";
   Statement statement1 = connection.createStatement();
   ResultSet resultSet1 = statement1.executeQuery(sqlQuery1);
   
   List<Entity1> entity1List = new ArrayList<>();
   
   while (resultSet1.next()) {
       Entity1 entity1 = new Entity1();
       // заполнение полей entity1 из resultSet1
       entity1List.add(entity1);
   }
   
   String sqlQuery2 = "SELECT * FROM entity2";
   Statement statement2 = connection.createStatement();
   ResultSet resultSet2 = statement2.executeQuery(sqlQuery2);
   
   List<Entity2> entity2List = new ArrayList<>();
   
   while (resultSet2.next()) {
       Entity2 entity2 = new Entity2();
       // заполнение полей entity2 из resultSet2
       entity2List.add(entity2);
   }
   
   // Добавляем связь между сущностями
   for (Entity1 entity1 : entity1List) {
       for (Entity2 entity2 : entity2List) {
           if (entity1.getId() == entity2.getEntity1Id()) {
               entity1.setEntity2(entity2);
               break;
           }
       }
   }

В обоих случаях, для выполнения SQL-запросов, мы используем базовые инструменты работы с базой данных в Java, такие как JDBC (Java Database Connectivity). В примерах использованы стандартные классы Statement, ResultSet и методы выполнения executeQuery(). Не забудьте заменить Entity1 и Entity2 на фактические классы сущностей, а также настроить соединение с базой данных.