gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:33:23 26 4
gpt4 key购买 nike

我想减少 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)”

关于java - 如何在自定义查询中加载@ElementCollection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56809818/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com