Spring Data - как сообщить Spring, какие объекты нужно извлечь - PullRequest
0 голосов
/ 14 мая 2019

Если у меня есть несколько энтитов, скажем:

@Entity
class Book{
String name;
Author author; 
}

@Entity
class Author{
String name;
City hometown;
}

@Entity
class City{
String cityName;
}

Если я захочу получить все книги, если я использую классический репозиторий JPA и Spring Data и просто сделаю findAll(), он получит мне все книги со всеми авторами со всеми их родными городами. Я знаю, что могу использовать @JsonIgnore, но я думаю, что это предотвращает только то, что возвращается, а не то, что ищется в базе данных. А также у меня есть методы, которые действительно хотят вернуть и книги, и авторов, поэтому @JsonIgnore -ing не работает для меня. Есть что-нибудь подобное? Рассказать Spring Data, что искать и что возвращать? Будем благодарны за любые ссылки, руководства или методы, о которых я не знаю.

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Spring Data имеет концепцию «проекций», которая позволяет вам возвращать различные представления одной и той же сущности.

Официальная документация:

Методы запроса Spring Data обычно возвращают один илинесколько экземпляров совокупного корня, управляемого хранилищем.Однако иногда может быть желательно создать проекции на основе определенных атрибутов этих типов. Spring Data позволяет моделировать выделенные типы возврата, чтобы более избирательно извлекать частичные представления управляемых агрегатов.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

Где Проекция является 'закрытой'projection (интерфейс проекции, все методы доступа которого соответствуют свойствам целевого агрегата), то в документации отмечается, что дополнительно:

Spring Data может оптимизировать выполнение запроса [для выбора только соответствующих полей], посколькумы знаем обо всех атрибутах, которые необходимы для поддержки прокси-сервера проекции

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections.interfaces.closed

Spring Data также позволяет динамически задавать проекции во время выполнения.Смотрите далее:

https://github.com/spring-projects/spring-data-commons/blob/master/src/main/asciidoc/repository-projections.adoc#dynamic-projections

0 голосов
/ 14 мая 2019
  • Сначала пометьте ваши отношения как LAZY
  • Затем укажите, какие данные нужно выбирать для каждого запроса.

См. Например: https://vladmihalcea.com/eager-fetching-is-a-code-smell/

...