【问题标题】:Query M:N relationship with GORM for entity instances _not_ in relation to each other?查询 M:N 与 GORM 的实体实例_not_ 之间的关系?
【发布时间】:2011-09-01 01:38:52
【问题描述】:

我需要跟踪与属性的 M:N 关系,所以我正在使用链接表(遵循Many-to-Many Mapping without Hibernate XML 的模式)......但是,我看不到如何查询该会员关系是否合法-但尚未存在的关系,例如,给定团队中的任何员工(或用户尚未出价的项目等)。我正在使用 HQL 进行研究,但我对此很陌生,因此我可以使用一些指导来了解哪种技术最有效……或者,这种查询的示例;)

为了讨论,假设Employees:Team Membership 类,每个类都有一个非常大的集合(太大而不能拉入中间层并进行集合操作)。

class Membership {
    Employee employee
    Team team
    String other // I need attributes on the relationship
}

class Employee {
    Date dateJoinedCompany
    String name
    static hasMany = [managedTeams:Team, memberships:Membership]
    static mappedBy = [managedTeams:"manager"]
}

class Team {
    String name
    Employee manager
    static belongsTo = Employee
    static hasMany = [memberships:Membership]
}

所以,我需要一个查询,它返回一个多月前加入公司的不属于团队 #2 的员工,或者员工 #5 不属于的团队,诸如此类的事情 什么是最好的技术 - 是否有如何使用标准做到这一点?或者,关于如何最好地使用 HQL 有什么建议吗?

我应该添加我当前的想法,使用 HQL 和子选择:

from Team t where t not in (select m.team from Membership m where m.employee = 5)

TIA!

【问题讨论】:

    标签: hibernate grails hql


    【解决方案1】:

    一个多月前改造公司的不在团队 2 中的员工:

    Employee.executeQuery("select e from Employee as e inner join e.memberships as m where m.team.id != :tId and e.dateJoinedCompany > :date", [tId: 2, date: new Date() - 60]
    //calculate the exact date. instead of using the team id you can use the team instance
    

    员工 #5 不属于的团队

    Team.exccuteQuery("select t from Team as t inner join t.memberships as m where m.e.id != :eId",[eId: 5])
    

    【讨论】:

    • 对成员资格使用内部联接会导致这些查询忽略成员资格表中未列出的实体 - 例如,加入一个多月前但尚未加入 的员工有会员吗?
    • 然后用左连接替换内连接
    • 只是为了让你知道:我没有放弃这个或忘记接受答案......但是(新手的危险!)我还不能让外部连接工作。在我的实际应用程序中,我有 Audio、UserCallFlow 和 Hearing 对象(UCF 中的用户收听音频,这些通过具有“audi”和“ucf”字段的 Hearing 表链接)。子选择 'Audio aud not in (select h.audio from Hearing h where h.ucf = :ucf' 正在工作,但使用 'from Audio aud left join aud.hearings h where h.ucf != :ucf' 总是返回一个空集。所以,仍然在破解!
    • 继续尝试。您可以激活休眠 sql 日志记录以查看输出的 sql 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多