Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails多对多关系的动态查找器_Grails_Many To Many_Dynamic Finders - Fatal编程技术网

Grails多对多关系的动态查找器

Grails多对多关系的动态查找器,grails,many-to-many,dynamic-finders,Grails,Many To Many,Dynamic Finders,我有两个域类,它们由多对多关系映射。我遵循了Grails文档的说明,但在处理这些域上的数据时仍然存在一些问题。以下是我的两个域类: class User { String name int age String job static hasMany = [groups : Group] static belongsTo = [org : Organization] } class Group { String groupName Stri

我有两个域类,它们由多对多关系映射。我遵循了Grails文档的说明,但在处理这些域上的数据时仍然存在一些问题。以下是我的两个域类:

class User {
    String name
    int age
    String job
    static hasMany = [groups : Group]
    static belongsTo = [org : Organization]
}

class Group {
    String groupName
    String code
    static hasMany = [members : User]
}
我的问题是:
1.上述关系需要一个类hold belongs作为关系的“所有者”。在此上下文中,用户属于组,但我不知道如何将belongsTo放入用户类,因为Grails建议的标准语法是static belongsTo=[Group](只指定所有者类名),因此我无法:
-将其放入exist belongsTo,如下所示:静态belongsTo=[org:Organization,Group]
-或者像这样定义另一个belongsTo:static belongsTo=[Group]

  • 下面是右示例:

    课堂用书{ 字符串标题 静态belongsTo=作者 静态hasMany=[作者:作者]

    static mapping = {
        authors joinTable:[name:"mm_author_books", key:'mm_book_id' ]
    }
    
    } 类作者{ 字符串名 静态hasMany=[书籍:书籍]

    static mapping = {
        books joinTable:[name:"mm_author_books", key:'mm_author_id']
    }
    
    }

  • (参考链接:)
    我的意思是,我们需要为每个类指定联接表的外键的名称吗

  • 如果我想找到属于名为“ABC”的指定组的所有用户,我如何使用Grails的DynamicFinder
  • 多谢各位

  • belongsTo
    将创建另一个M:1关系(字段)-您可以告诉您的案例中是否有
    用户的“主组”。如果我只希望强制执行至少一个组,我会为
    User.groups
    使用自定义验证器检查它是否为空

  • (这里我不确定)-如果密钥名与默认的Hibernat/GORM“
    userId
    ”/“
    groupId
    ”不同,我相信是的

  • findBy*()
    方法在这里不起作用,您需要一个CriteriaBuilder,比如


  • m2m关系很少有自己的一方,所以我总是觉得必须指定一方才能让GORM正常工作很奇怪。正因为如此,我才不会这样做。我将连接表创建为一个域。然后事情变得非常简单

    然后,您只需要在用户和组类中创建getter。两个类中都没有用户或组。不需要将它们映射为hasMany/belongsTo,因为所要做的就是创建联接表,这是通过创建用户组域完成的

    class User {
       Set<Group> getGroups() {
        UserGroup.findAllByUser(this).collect { it.group } as Set
      }
    }
    
    class Group {
      Set<User> getUsers() {
        UserGroup.findAllByGroup(this).collect { it.user } as Set
      }
    }
    
    你明白了。这就更清楚地说明了为什么这是一个好方法,以及其他一些提高性能的好技巧

    class User {
       Set<Group> getGroups() {
        UserGroup.findAllByUser(this).collect { it.group } as Set
      }
    }
    
    class Group {
      Set<User> getUsers() {
        UserGroup.findAllByGroup(this).collect { it.user } as Set
      }
    }
    
    def userGroupInstance = UserGroup.findByUserAndGroup(userInstance, groupInstance)
    def userGroups = UserGroup.findAllByUser(userInstance)
    def userGroupInstance = UserGroup.get(userId, groupId)