【问题标题】:grails gorm how to do a join with a 3 table hierarchygrails gorm如何使用3个表层次结构进行连接
【发布时间】:2013-10-31 15:28:04
【问题描述】:

我的网络界面有一个 ajax 调用来更新照片的标题。帖子将照片的标题和 publicId 发送到服务。

The service has 

Photo photo = Photo.findByPublicId(params.publicId)
photo.caption = params.caption
photo.save()

但是,我在 Burt Beckwith 的 grails 书中读到这并不安全。照原样,黑客可以将任何 publicId 发布到我的服务并更新 不属于他们会话的照片的标题。我需要一些关于如何编写更新查询以仅更新属于的照片的 GORM 建议 到当前用户的会话。由于涉及的连接数量,我迷路了。我熟悉获取配置文件/用户:

    User user = User.load(springSecurityService.principal.id)

    Profile profile = Profile.findByUser(user, [lock:true])

但不是一个查询会加入整个更新的所有内容,而不是 Profile.findByUser(user, [lock:true]).photoAlbum.getPhotoWherePublicId(publicId) 或似乎会进行 4 次不同 sql 调用的东西。

我拥有的具有相关层次结构的域架构是:

//user from springsecurity for session/login management
class User {
   //no reference to profile
}

class Profile {
   PhotoAlbum photoAlbum
   User user //reference to user

   static constraints = {
       photoAlbum(nullable:true)
   }
}

class PhotoAlbum {
   static hasMany = [photos:Photo]
   static belongsTo = [profile:Profile]
}

class Photo {
   static belongsTo = PhotoAlbum
   String caption
   String publicId
}

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    也许使用条件或命名查询可以做到这一点。 这样的事情可能会奏效:

    首先对你的 Photo 类做一个小改动

    class Photo {
       PhotoAlbum photoAlbum
       static belongsTo = [photoAlbum: PhotoAlbum]
       String caption
       String publicId
    }
    

    并尝试使用此标准

    Photo.withCriteria{
      eq 'id',params.publicId
      photoAlbum {
        eq 'profile',profile
      } 
    }
    

    【讨论】:

    • PhotoAlbum photoAlbum 在您的示例中不是必需的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多