쿼리 연관 문제를 낳습니다
문제
다음 도메인 클래스에 대한 쿼리를 작성하는 데 어려움이 있습니다.
class Person {
static hasMany = [memberships: Membership]
}
class Membership {
static belongsTo = [person: Person, group: Group]
Date joinDate = new Date();
Group group;
Person person;
}
class Group {
static hasMany = [memberships: Membership]
}
기본적으로 그룹 목록에 속하는 모든 사람을 찾고 싶습니다 (그룹 ID가 (1,2)
. 여기서 속임수는 그 사람이 두 그룹의 구성원이어야한다는 것입니다. 기준 쿼리를 선호하지만 HQL도 괜찮습니다.
같은 것으로 쿼리 group.id in (1,2)
그룹이 될 수 있기 때문에 작동하지 않습니다. 둘 다.
해결책
그것은 나의 간단한 HQL 접근법입니다.
Person.executeQuery("FROM Person x WHERE x IN (SELECT m.person from Membership m WHERE m.group = :group1) AND x IN (SELECT m.person from Membership m WHERE m.group = :group2)", [ group1: Group.get(1), group2: Group.get(2) ])
건배
다른 팁
쿼리가 필요하지 않을 수도 있습니다. 개인 수업에서 멤버십은 멤버십 오브젝트 목록입니다. 쿼리를하지 않고 객체가 수집 (목록)에 있는지 확인할 수 있습니다. 이와 같은 일은 일을해야합니다.
if(Person.memberships.contains(Membership.findByPersonAndGroup(person1,group1)) && Person.memberships.contains(Membership.findByPersonAndGroup(person1,group2))){
...do something...
}
아마도 다른 솔루션은 단순하지만, 이것이 또 다른 옵션이라고 생각합니다.
건배
흥미로운 문제. 이전 솔루션이 일치하는 그룹의 수에 대해 일반적이지는 확실하지 않습니다. 지금까지는 2로 고정되어 있습니다. 아마도 가변적으로 만들 수있는 방법이있을 것입니다.
Grails Messageboard에서 여기서 설명하는 또 다른 방법 - http://www.nabble.com/has-many-through-rhourgrough-relationship-query--gorm--td23438096.html
저자 인 Robert Fischer의 논평을 포함하여 "Gorm과 GSQL을 통한 끈기".
@chadsmall
다음은 Where 조항에 대한 하위 쿼리를 프로그래밍 방식으로 추가하지 않아도되는 또 다른 접근법입니다.
질문:
SELECT count(person.id) AS numPeople, person
FROM Person as person
INNER JOIN
person.memberships AS mships
WITH mships.group.id IN (:groupIds)
GROUP BY person.id
HAVING COUNT(person.id) = (:numOfGroupIds)
그리고 몇 가지 예 값 :
[
groupIds: [8,9,439,86843]
numOfGroupIds: 4
]
이 쿼리의 일부는 그룹까지의 일부가 일치하는 모든 사람들을 잡습니다. 어느 그룹의. 그런 다음 사람별로 그룹화하고 결과 수를 확인하면 목록의 그룹 수와 같습니다.이 사람이 지정된 모든 그룹의 구성원임을 확인할 수 있습니다.