Grails/Hibernate标准,用于检查hasMany关联是否包含某些实体

Grails/Hibernate标准,用于检查hasMany关联是否包含某些实体,hibernate,grails,hql,gorm,Hibernate,Grails,Hql,Gorm,我在Grails项目中有三个域类: class Conversation { static hasMany = [members: ConversationMember] } class ConversationMember { User user static belongsTo = [conversation: Conversation] } class User { String name } 我想构造一个Hibernate标准,允许我在给定两个用户的

我在Grails项目中有三个域类:

class Conversation {
    static hasMany = [members: ConversationMember]
}

class ConversationMember {
    User user
    static belongsTo = [conversation: Conversation]
}

class User {
    String name
}
我想构造一个Hibernate标准,允许我在给定两个用户的情况下返回包含引用这两个用户的ConversationMembers的所有对话

也就是说,如果我与Josh和Jordyn进行对话A,与Josh和Sam进行对话B,与Josh、Jordyn和Sam进行对话C,那么给定Josh和Jordyn的标准应返回对话A和C

我尝试了以下方法,但似乎不起作用:

List<Conversation> conversations = Conversation.createCriteria().list() {
    and {
        members {
            ne('user', currentUser)
        }
        members {
            ne('user', conversationMemberToSearch)
        }
    }
}

List<Conversation> conversations = Conversation.createCriteria().list() {
    not {
        or {
            members {
                ne('user', currentUser)
            }
            members {
                ne('user', conversationMemberToSearch)
            }
        }
    }
}
如果不使用sqlRestriction,我似乎找不到实现这一点的方法。有什么想法吗?

您可以在条件中使用sqlRestriction来编写本机sql,或者更好地编写hql查询。 Hql看起来像:来自对话,其中:成员中的第一个用户和成员中的第二个用户。
sqlRestriction将是:从会话成员中选择count*,其中${firstUser.id}、${secondUser.id}中的成员id和会话成员id=\this.id==2,但您应该检查表和字段名_此->通常表示条件中的当前主实体,在您的情况下,它将是对话。

我希望找到一个不使用sqlRestriction的解决方案,但如果我仍然可以使用HQL,我会更加开放。所以我可以把sqlRestriction“:firstUser放在members中,把:secondUser放在members中,或者类似的东西?我还没有找到在sqlRestriction字段中使用HQL的任何文档/示例。