У меня есть такая задача: весной / hibernate / postgres У меня есть сущность (агрегат), которая содержит jsonb с дочерними кодами. Как в контейнере может быть 100 блоков сигарет, каждый из которых содержит 10 пакетов, и все они (все 3 уровня) имеют уникальный код и расположены в одной таблице БД.
@Entity
@Table(name = "code")
@Getter
@Setter
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
public class CodeDO {
@Id
private String code;
private String status;
private String type;
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private JsonNode children; // contains {code1, code2, code3}
}
Мне нужно написать HQL или SQL запрос для получения Jsonb и для каждого элемента (дочернего элемента) SELECT * FROM code. Только для детей на 1 уровень ниже. Теперь у меня есть что-то вроде этого:
@RequiredArgsConstructor
@Service
public class CodeServiceImpl implements CodeService {
private final CodeRepository codeRepository;
public List<List> getCodeFromAggregateChildren(String id, KmListRequest req) {
JsonNode jsonNode = codeRepository.getById(id).getChildren();
List<String> idList = new ObjectMapper().convertValue(jsonNode, List.class);
List<JsonNode> childNodes= idList.forEach(childId -> codeRepository.getById(childId));
return childNodes.stream().map(child -> new ObjectMapper().convertValue(child, List.class)).collect(Collectors.toList());
}
}
Так что это работает как 2 запроса. Первое: получить детей, второе: выбрать для каждого ребенка. Задача не касаться БД дважды, объединить эти 2 запроса в один.