Как загрузить @ElementCollection в пользовательском запросе? - PullRequest
1 голос
/ 28 июня 2019

Я хочу уменьшить количество запросов к весне.При получении объекта с помощью @ElementCollection через SQL я хочу получить данные для ElementCollections напрямую через JOIN в запросах.

Атрибут с ElementCollection

@ElementCollection(fetch = FetchType.EAGER)
    @JoinTable(name = "song_genre_list")
    @org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    private List<String> genre;

Метод, который используетпользовательская строка:

@Query(
    value = "select distinct s.*, g.* from musicdb.songs s left join musicdb.song_genre_list g on s.id = g.song_id where s.name like ?1 or s.artist like ?1",
    nativeQuery = true)
List<Song> searchSong(String title);

Как я могу представить определение запроса, который также загружает эту коллекцию элементов:

SELECT DISTINCT s.*, g.* FROM musicdb.songs s LEFT JOIN musicdb.song_genre_list g ON s.id = g.song_id WHERE s.name LIKE ?1 OR s.artist LIKE ?1

Что делает Spring в настоящее время (загрузка жанров для 3 песен с большим количеством запросов):

Hibernate: select distinct s.*, g.* from musicdb.songs s left join musicdb.song_genre_list g on s.id = g.song_id where s.name like ?1 or s.artist like ?1
Hibernate: select genre0_.song_id as song_id1_4_0_, genre0_.genre as genre2_4_0_ from musicdb.song_genre_list genre0_ where genre0_.song_id=?
Hibernate: select genre0_.song_id as song_id1_4_0_, genre0_.genre as genre2_4_0_ from musicdb.song_genre_list genre0_ where genre0_.song_id=?
Hibernate: select genre0_.song_id as song_id1_4_0_, genre0_.genre as genre2_4_0_ from musicdb.song_genre_list genre0_ where genre0_.song_id=?

Что я хочу, чтобы Spring сделал:

Hibernate: select distinct s.*, g.* from musicdb.songs s left join musicdb.song_genre_list g on s.id = g.song_id where s.name like ?1 or s.artist like ?1

Необходимые данные для ElementCollection уже включены в объединение.Как я могу сказать пружине импортировать эти данные?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...