我有3个表,播放列表,歌曲和播放列表_歌曲。 Playlist_Song具有playlist_id外键和user_id外键。我需要获取特定播放列表中的歌曲列表,因此我想对Playlist_Song进行数据库调用,以返回所有带有playlist_id的条目。
然后,我使用歌曲ID对歌曲表进行数据库调用,以检索这些歌曲。我觉得这是非常低效的,应该有更好的方法,但是我真的不知道该怎么做。有什么建议吗?
public List<Song> getSongsInPlaylist(final int playlistId) {
final List<PlaylistSong> playlistSongs = playlistSongDao.getPlaylistSong(playlistId);
if (!playlistSongs.isEmpty()) {
final List<Song> songs = new ArrayList<>();
for (PlaylistSong existingPlaylistSong : playlistSongs) {
songs.add(songDao.findById(existingPlaylistSong.getSongId()).get());
}
return songs;
}
答案 0 :(得分:0)
作为歌曲ID的列表传递到songDao,并在一个查询中作为列表进行检索。 songDao.findByIdIn(列出songIds)。
答案 1 :(得分:0)
对于这种简单的实现,不需要使用dao和访问联接表。如果您这样定义模型,则应该能够使用在播放列表模型上定义的简单getSongs()方法访问播放列表中的歌曲。
歌曲模型:
val observer = mock<Observer<Int>>()
播放列表模型:
@Entity
@Data
public class Song {
@Id
@GeneratedValue (strategy = GenerationType.IDENTITY)
private Integer id;
@Column (name = "title")
private String title;
// some other properties...
@ManyToMany (mappedBy = "songs")
private List<Playlist> playlists = new ArrayList<>();
}
要仅使用Hibernate来获取特定的播放列表(尽管使用Spring存储库更容易),则可以使用Session对象来获取它。
@Entity
@Data
public class Playlist {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name")
private String name;
// some other properties...
@ManyToMany (cascade = CascadeType.ALL)
@JoinTable (
name = "Playlist_Song",
joinColumns = { @JoinColumn (name = "playlist_id") },
inverseJoinColumns = { @JoinColumn (name = "song_id") }
)
private List<Song> songs = new ArrayList<>();
}