Grails /休眠标准,检查hasMany关联是否包含某些实体

时间:2018-08-02 19:10:03

标签: hibernate grails hql gorm

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

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

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

class User {
    String name
}

我想构造一个休眠条件,使我能够在给定两个用户的情况下返回所有包含引用这两个用户的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做些什么,我似乎找不到找到解决方法。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以在标准中使用sqlRestriction来编写本机sql或更好地编写hql查询。 Hql看起来像:"from Conversation where :firstUser in members and :secondUser in members"。 sqlRestriction将为:"(select count(*) from conversation_members where member_id in (${firstUser.id}, ${secondUser.id}) and conversation_members_id = _this.id) == 2",但是您应该检查表和字段名称。 _this->通常在您的情况下代表标准中的当前主要实体,Conversation