hibernate - Grails:如何使用具有sort属性的多对多关系来获取域对象的排序列表?

标签 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行上收到一个错误的意外 token :

尽管可能有多种方法可以做到这一点,但我想找出哪种方法更适用于Grails。谢谢!

最佳答案

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

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

然后,在您的 View 中,可以显示如下歌曲:
<g:each in="${playlistSongs.collect { it.song }}" var="song">
    <p>${song.title}</p>
</g:each>

关于hibernate - Grails:如何使用具有sort属性的多对多关系来获取域对象的排序列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24715008/

相关文章:

java - 从 Hibernate 调用 Oracle 存储函数

mysql - GORM/Hibernate 未创建正确的 INSERT 语句

grails 服务层次结构

spring - 如何使用传播 REQUIRES_NEW 等待事务提交

linux - Grails 安装

Grails 从 session 更改数据库 URL 连接

java - 如何在JPA中生成sql?

java - Hibernate ASM Spring java.lang.NoSuchMethodError sessionFactory

java - Hibernate:Criteria 和 HQL 的映射行为之间的差异

grails - 使用Kendo UI上传文件