grails gorm如何使用3表层次结构进行连接

时间:2013-10-31 01:45:29

标签: grails gorm

我的网络界面有一个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(用户,[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
}

1 个答案:

答案 0 :(得分:1)

也许有一个标准或者命名为Querie,这可以做到。 这样的事情可能有用:

首先对Photo类进行一些小改动

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

并尝试使用此标准

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