【问题标题】:Grails: How do I fetch a sorted list of domain objects in a many-to-many relationship with sort attribute?Grails:如何获取与排序属性具有多对多关系的域对象的排序列表?
【发布时间】: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

标签: hibernate grails


【解决方案1】:

我会查询PlaylistSong,而不是Song。以下是使用 where 查询的方法:

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>

【讨论】:

  • 感谢grantmcconnaughey!我对您的解决方案进行的唯一调整是在 where 闭包中:playlist.id == params.playlistId
  • 太棒了!我更新了我的答案以适合你。
  • 啊,当然。当您从 iPod Touch 键入代码时,就会发生这种情况。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
相关资源
最近更新 更多