如何在自定义查询中加载@ElementCollection?

时间:2019-06-28 15:48:53

标签: java sql spring hibernate jpa

我想减少spring之前运行的查询数量。通过SQL使用@ElementCollection获取对象时,我想直接通过查询中的JOIN获取ElementCollections的数据。

带有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所需的数据。我该如何告诉spring导入该数据?

1 个答案:

答案 0 :(得分:0)

FetchType.EAGER已经为您加载了类型,因此您无需在原始查询中编写联接。但是对于该休眠,默认情况下,休眠使用单独的查询。要更改此设置,请在流派字段上添加注释“ @Fetch(FetchMode.JOIN)”