我想减少 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 导入该数据?
FetchType.EAGER 已经为您加载流派,因此您无需在原始查询中编写联接。但对于 hibernate,hibernate 默认情况下使用单独的查询。要更改此设置,请在流派字段上添加注释“@Fetch(FetchMode.JOIN)”
我是一名优秀的程序员,十分优秀!