【发布时间】:2021-12-07 12:14:35
【问题描述】:
歌曲和艺术家之间存在这样的多对多关系:
public class Song {
// ... other fields here
protected Collection<Artist> artists;
@JoinTable(
name = "song_artists",
schema = "playout",
joinColumns = @JoinColumn(name = "song"),
inverseJoinColumns = @JoinColumn(name = "artist"),
foreignKey = @ForeignKey(name = "fk_song_artists_song"),
inverseForeignKey = @ForeignKey(name = "fk_audio_artists_artist")
)
@ManyToMany
public Collection<Artist> getArtists(){
return artists;
}
}
艺术家类是一个基本实体
public class Artist {
}
给定一首歌曲 x,显示参与歌曲 x 的任何艺术家的歌曲 , 一个原始的 SQL 查询应该是这样的
SELECT * FROM songs WHERE id IN((SELECT song FROM song_artists x WHERE x.artist = ?));
在哪里?将被相关歌曲中涉及的艺术家 ID 的逗号分隔字符串替换
如何使用 JPA 实现相同的结果(专门使用 Hibernate)
Song song = null; // get desired song
Collection<Artist> artists = song.getArtists();
CriteriaBuilder builder = entityManager.getCriteriaBuilder()
CriteriaQuery criteria = builder.createQuery(Song.class);
Root<Song> root = criteria.from(Song.class);
Subquery<Artist> subquery = null; // how to create an appropriate subquery from the join
我们如何在这里过滤结果(获取“艺术家”收藏中任何艺术家的更多歌曲)?
非常感谢您的反馈
【问题讨论】:
标签: spring-boot hibernate jpa criteria hibernate-criteria