GORM访问列表索引为hasMany关联

时间:2013-08-30 03:09:09

标签: hibernate grails gorm

我的应用程序具有与相册和单张照片具有相同逻辑关系的域类。对List关联使用hasMany应支持单个相册中的向后和向前移动,而无需明确管理位置字段或上一个/下一个指针。

例如:

class Album {
    static hasMany = [photos: Photo]
    List photos // Generates column `album_idx` in table for Photo.
    Integer size // Memoized.
}

class Photo {
    static belongsTo = [album: Album]
    static hasOne = [content: PhotoData] // PhotoData has byte[] field for data
}

class Controller {
    def prev() {
        def prevIdx = idx==0 ? album.size - 1 : idx -1 // etc.
    }
}

我可以在没有本机SQL查询的情况下访问_idx的值吗?

我已尝试过photo.album.photos.indexOf(photo),但indexOf会返回-1,因为加载显然对indexOf来说太懒了,不过一般来说我想要延迟加载。我责备延迟加载,因为在调试器列表中项目是随机填充的,我怀疑那些以前只是缓存的。我可能会误解GORM在这里的行为。

在任何情况下photo.album.photos.indexOf(photo)都比直接的现场访问更加丑陋(可能)更慢。理想情况下,我可以在生成的_idx列和Photo中的字段之间定义映射,以允许使用photo.albumIdx进行访问。

1 个答案:

答案 0 :(得分:4)

indexColumnupdateableinsertable映射结合使用,您可以识别收集项(例如您的照片)索引。例如:

class Album {
    static hasMany = [photos: Photo]
    List photos // Generates column `album_idx` in table for Photo.
    Integer size // Memoized.

    static mapping = {
      photos indexColumn: [name: "position", type: Integer]
    }
}

class Photo {
    Integer position

    static belongsTo = [album: Album]
    static hasOne = [content: PhotoData] // PhotoData has byte[] field for data

    static mapping = {
      position updateable: false, insertable: false
    }
}

photo.position现在将为您提供此照片的索引(注意:默认情况下,列表顺序为0)