Вложенный выбор для совокупных дочерних элементов jsonb, SQL / HQL - PullRequest
1 голос
/ 10 февраля 2020

У меня есть такая задача: весной / 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 запроса в один.

1 Ответ

0 голосов
/ 30 марта 2020

Я нашел статью, которая может быть полезна Как запросить jsonb . По сути, вы бы сделали в своем классе репозитория что-то вроде:

@Query("SELECT * FROM code WHERE children ->> 'code' = :code", nativeQuery=true)
List<Code> findAllByCode(@Param("code") String code);

К сожалению, я не смог найти никакой помощи с HQL-запросом, только нативный.

...