【发布时间】:2023-03-18 11:27:01
【问题描述】:
我的示例模型是一个播放列表,其中一个播放列表可以包含许多歌曲,而一首歌曲可以在多个播放列表中。因此,播放列表和歌曲之间的每个映射都有一个位置参数来定义顺序。我尝试使用标准 Grails 多对多方法仅使用两个域对象创建此映射,但我无法弄清楚如何以这种方式访问连接表中的位置属性。这是我最新版本的域对象:
class Song {
String title
static hasMany = [ playlistSongs: PlaylistSong ]
static constraints = { title blank: false, unique: true }
}
class Playlist {
String name
static hasMany = [ playlistSongs: PlaylistSong ]
static constraints = { name blank: false, unique: true }
}
class PlaylistSong {
Playlist playlist
Song song
integer position
}
我一直在尝试编写的查询是获取给定播放列表中的歌曲,使用 position 属性对结果进行排序。例如,像这样:
result = Song.executeQuery("""
SELECT s.id, s.title from Song s
inner join playlistSongs pls on s.id = pls.song.id
where pls.playlist.id = (:playlist_id)""", [playlist_id: params.playlistId])
对于这个特定的查询尝试,我收到一个错误的意外令牌:在第 3 行靠近第 45 列。
虽然可能有不止一种方法可以做到这一点,但我想找出哪种方法更受欢迎,并且对于 Grails 来说更常见。谢谢!
【问题讨论】:
-
尝试删除
:playlist_id周围的括号。另外,我认为您只需要 HQL 中的join,而不是inner join。最后,将playlistSongs更改为PlaylistSong。