Запрос M: N отношения с GORM для экземпляров сущности _not_ по отношению друг к другу? - PullRequest
0 голосов
/ 01 сентября 2011

Мне нужно отследить отношение M: N с атрибутами, поэтому я использую таблицу ссылок (следуя шаблону в Отображение «многие ко многим» без XML Hibernate ) ... но яне может понять, как запросить эти отношения Членства для законных, но еще не существующих отношений, например, каких-либо Сотрудников , а не в данной Команде (или Предметах, на которые Пользователь еще не предлагал цену)и т. д.).Я работаю над этим в 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!

1 Ответ

0 голосов
/ 01 сентября 2011

Сотрудники, не входящие в Команду № 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])
...