문제

다음 도메인 클래스에 대한 쿼리를 작성하는 데 어려움이 있습니다.

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
]

이 쿼리의 일부는 그룹까지의 일부가 일치하는 모든 사람들을 잡습니다. 어느 그룹의. 그런 다음 사람별로 그룹화하고 결과 수를 확인하면 목록의 그룹 수와 같습니다.이 사람이 지정된 모든 그룹의 구성원임을 확인할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top