Ленивая загрузка с CrudRepository - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть простое отношение родитель-ребенок (один ко многим).И я ищу родителей в двух конечных точках.Один, чтобы получить список родителей, и один, чтобы получить одного родителя.В списке я не хочу сериализовать список детей для каждого родителя.Я хочу показывать список детей только тогда, когда я получаю одного из родителей.

Я работаю с весенней загрузкой и CrudRepository.Я попробовал

spring.jpa.open-in-view=false
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

, а также fetch = FetchType.LAZY, и в конце я написал собственный HQL с ключевым словом FETCH.

Родительская модель

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
private List<Child> children;

Дочерняя модель

@Column(name = "parent_id")
@JsonIgnore
private Long parentId;

Родительский репозиторий

 public interface ParentRepository extends CrudRepository<Parent, Long> 

Родительская служба

List<Parent> findAll() {
    return StreamSupport
            .stream(repository.findAll().spliterator(), false)
            .collect(Collectors.toList());
}

Как я уже сказал, я хочу иногда сериализовать список детей в этом отношении, а в некоторых случаях нет.

Ответы [ 3 ]

0 голосов
/ 01 января 2019

Вы можете сделать это, используя JsonView или JsonFilter с Джексоном.Другой вариант - разделить проблемы, то есть использовать DTO для управления сериализованным представлением объекта.Вот ссылка на учебник по некоторым из этих функций Джексона: https://www.baeldung.com/jackson-serialize-field-custom-criteria

0 голосов
/ 03 января 2019

Хорошо, я наконец-то это сделал.Я написал специальный HQL для родителей без детей.

    @Query("SELECT new Parent(a.parentId, a.name, a.address, a.city) FROM Parent a WHERE a.otherId= :id")
List<Parent> findAllBySomeOtherIdWithoutChildren(@Param("id") Long id);

Похоже, это самый быстрый способ для этого.Спасибо за все предложения.

0 голосов
/ 30 декабря 2018

Скорее всего, это связано с открытием сеанса по умолчанию в представлении.Начиная с версии 2.0

Если вы добавили строку ниже в файл конфигурации application.properties, то он должен работать

spring.jpa.open-in-view=false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...