hasMany 关联的 GORM 访问列表索引

rev*_*nge 3 grails hibernate grails-orm

我的应用程序具有与相册和单张照片具有相同逻辑关系的域类。使用 aList进行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.
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试过photo.album.photos.indexOf(photo),但indexOf返回-1,因为加载显然太懒了indexOf,尽管一般来说我确实想要延迟加载。我归咎于延迟加载,因为在调试器列表中项目是随机填充的,我怀疑那些只是之前缓存的。我可能误解了 GORM 的行为。

无论如何,photo.album.photos.indexOf(photo)它比立即现场访问更丑陋并且(可能)更慢。_idx理想情况下,我可以定义生成的列和 中的字段之间的映射Photo,以允许使用 进行访问photo.albumIdx

iku*_*men 5

indexColumn可更新可插入映射结合使用,您可以让集合项(例如您的照片)索引感知。例如:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

photo.position现在将为您提供这张照片的索引(注意:默认列表顺序是从 0 开始)