Предельный размер каскадно-извлекаемых сущностей Джексона / JPA - PullRequest
0 голосов
/ 26 февраля 2019

Рассматривая стек приложения с SpringBoot, MySQL, SpringData / JPA и Джексоном.

Я пытаюсь найти способ ограничить размер динамически извлекаемых сущностей.В упрощенной схеме давайте предположим, что у нас есть сообщение с несколькими комментариями, но для быстрого предварительного просмотра я просто хочу получить первые 10 комментариев вместе с сообщением.

Я бы вызвал репозиторий SpringData для загрузкиотправьте сообщение с идентификатором 10, но сериализатор Джексона будет циклически проходить через все комментарии и создавать потенциально огромный вывод.

Самый простой способ, который я нашел, - это сказать Джексону @JsonIgnore поле и затем при получении службыпервые 10 комментариев и прикрепить их к объекту в отдельном поле, помеченном как временное.

    @JsonView(Views.Detailed.class)
    @JsonProperty("comments")
    @OneToMany(
            mappedBy = "comment",
            fetch = FetchType.LAZY
    )
    @OrderBy("created_at DESC")
    @Limit(10) // This is the kind of annotation I'm looking for
    List<Comment> comments = new ArrayList<>();

Я знаю, что мог бы создать Getter, который реализует логику для возврата подсписка, но в этой ситуации весь списокбудет извлечен, верно?

Со стороны Джексона я мог бы попытаться ограничить глубину и длину сериализации, используя собственный картограф или аннотацию (что было бы лучше и чище), но я не нашел способаДобейся этого.

1 Ответ

0 голосов
/ 26 февраля 2019

Лимит Вы можете использовать лимит, чтобы получить только 10 записей

@Query(value="select * from user limit 10",nativeQuery=true)

Pageable

findById(@Param("userId") String userId, Pageable pageable);

Pageable topTen = new PageRequest(0, 10);
findById(userId , topTen);

Jpa Doc

...