jOOQ заявка с вложен списък

Може ли jOOQ да картографира резултатите от заявката към множество вложени списъци в POJO? Например имам POJO VM, който представлява виртуална машина. Той има свойството на „мрежи“, което е списък от тип мрежа. Той също така има свойството на "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