Grails:如何使用sort属性获取多对多关系中的域对象的排序列表?

时间:2014-07-12 16:31:49

标签: hibernate grails

我的示例模型是播放列表,其中播放列表可以包含许多歌曲,并且歌曲可以在许多播放列表中。因此,播放列表和歌曲之间的每个映射都具有用于定义顺序的位置参数。我试图用两个域对象创建这个映射,就像标准的Grails多对多方法一样,但是我无法弄清楚如何以这种方式访问​​连接表中的position属性。这是我最新版本的域对象:

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])

对于此特定查询尝试,我收到错误意外令牌:在第45行附近的第3行。

虽然可能有多种方法可以做到这一点,但我想知道哪种方式更受欢迎,而且更常见于Grails。谢谢!

1 个答案:

答案 0 :(得分:1)

我会在PlaylistSong上进行查询,而不是Song。以下是查询位置的方法:

def playlistSongs = PlaylistSong.where {
    playlist.id == params.playlistId
}.list(sort: 'position', order: 'asc')

然后在您的视图中,您可以显示如下歌曲:

<g:each in="${playlistSongs.collect { it.song }}" var="song">
    <p>${song.title}</p>
</g:each>