Может ли jOOQ сопоставить результаты запроса с несколькими вложенными списками внутри POJO? Например, у меня есть виртуальная машина POJO, которая представляет виртуальную машину. У него есть свойство «сетей», которое представляет собой список типа «Сеть». У него также есть свойство «hdds», которое представляет собой список типа «HDD». Запрос объединяет таблицы VM, HDD и Networks. Могу ли я просто «загрузить» в VM.class и ожидать, что jOOQ «поступит правильно»?
запрос jOOQ с вложенным списком
Ответы (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, не страдают от этого ограничения, поскольку они не позволяют выражать произвольные объединения.
Но у вас есть определенные возможности отображать денормализованные наборы результатов во вложенные коллекции:
- С помощью _8 _ а>
- С Java 8 _ 9_
- С помощью ModelMapper
- С помощью JPA