有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想减少spring运行的查询数量。通过SQL获取带有@ElementCollection的对象时,我希望通过quers中的联接直接获取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) 个答案

  1. # 1 楼答案

    获取类型。EAGER已经为您加载了类型,所以您不需要在原始查询中编写join。但对于这种情况,hibernate默认使用单独的查询。要更改此设置,请在类型字段中添加注释“@Fetch(FetchMode.JOIN)”