【问题标题】:Grails/Hibernate criteria to check if a hasMany association contains certain entities用于检查 hasMany 关联是否包含某些实体的 Grails/Hibernate 标准
【发布时间】:2019-01-10 15:20:21
【问题描述】:

我在一个 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 做某事,我似乎无法找到实现此目的的方法。有什么想法吗?

【问题讨论】:

    标签: hibernate grails hql grails-orm


    【解决方案1】:

    您可以在条件中使用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

    【讨论】:

    • 我希望在不使用 sqlRestriction 的情况下找到解决方案,但如果我仍然可以使用 HQL,我会更加开放。所以我可以输入sqlRestriction ':firstUser in members and :secondUser in members' 或类似的东西?我找不到任何在 sqlRestriction 字段中使用 HQL 的文档/示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2021-05-09
    • 2023-03-23
    • 2020-07-06
    • 2012-11-27
    • 2018-05-01
    相关资源
    最近更新 更多