запрос jOOQ с вложенным списком

Может ли jOOQ сопоставить результаты запроса с несколькими вложенными списками внутри POJO? Например, у меня есть виртуальная машина POJO, которая представляет виртуальную машину. У него есть свойство «сетей», которое представляет собой список типа «Сеть». У него также есть свойство «hdds», которое представляет собой список типа «HDD». Запрос объединяет таблицы VM, HDD и Networks. Могу ли я просто «загрузить» в VM.class и ожидать, что jOOQ «поступит правильно»?


person Deven Phillips    schedule 01.09.2015    source источник


Ответы (1)


Использование SQL / XML или SQL / JSON для вложения коллекций в jOOQ 3.14

Начиная с jOOQ 3.14, предпочтительный подход здесь - используйте SQL / XML или SQL / JSON для вложения коллекций непосредственно в SQL. Например:

class Vm {
  String name;
  List<Network> networks;
  List<Hdd> hdds;
}

Теперь вы можете написать:

List<Vm> result =
ctx.select(
      VM.NAME,
      field(
        select(jsonArrayAgg(jsonObject(
          key("id").value(NETWORK.ID),
          key("name").value(NETWORK.NAME),
          // ...
        )))
        .from(NETWORK)
        .join(NETWORK_TO_VM).on(NETWORK.NETWORK_ID.eq(NETWORK_TO_VM.NETWORK_ID))
        .where(NETWORK_TO_VM.VM_ID.eq(VM.VM_ID))
      ).as("networks"),
      field(
        select(jsonArrayAgg(jsonObject(
          key("id").value(HDD.ID),
          key("name").value(NETWORK.NAME),
          // ...
        )))
        .from(HDD)
        .join(HDD_TO_VM).on(HDD.HDD_ID.eq(HDD_TO_VM.HDD_ID))
        .where(HDD_TO_VM.VM_ID.eq(VM.VM_ID))
      ).as("hdds")
   )
   .from(VM)
   .fetchInto(Vm.class);

Обратите внимание, что JSON_ARRAYAGG() объединяет пустые множества в NULL, а не в пустой []. Если это проблема, используйте COALESCE()

Исторический ответ (до jOOQ 3.14)

Основная причина, по которой такие функции сопоставления возможны только в ограниченной степени в такой библиотеке, как jOOQ, заключается в том, что при объединении таблиц и денормализации результатов jOOQ больше не имеет необходимой информации для правильной дедупликации кортежей верхнего уровня (VM в вашем случае ). Популярные ORM, реализующие JPA, не страдают от этого ограничения, поскольку они не позволяют выражать произвольные объединения.

Но у вас есть определенные возможности отображать денормализованные наборы результатов во вложенные коллекции:

person Lukas Eder    schedule 03.09.2015