【问题标题】:GORM access list index of hasMany associationhasMany关联的GORM访问列表索引
【发布时间】:2013-09-02 16:10:41
【问题描述】:

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

例如:

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 进行访问。

【问题讨论】:

  • 如果您执行b.a.bees.indexOf(b),您会得到什么错误?为什么要查找索引?
  • @dmahapatro 我稍微改变了整个问题,希望现在更加明确/清晰。顺便说一句,感谢您之前的编辑。
  • 我最近需要获取该索引 - 最终明确放置了一个索引列。管理它根本不需要太多工作。

标签: hibernate grails grails-orm


【解决方案1】:

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 开始的)

【讨论】:

  • 谢谢,我认为可以,但不知道如何正确设置映射。
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多