Frage

Ich habe Probleme, eine Abfrage für die folgenden Domain-Klassen zu schreiben:

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]
}

Grundsätzlich mag ich alle Personen gefunden, die von Gruppen zu einer Liste gehört (Sagen sie Gruppen-IDs sind (1,2). Der Trick dabei ist, dass die Person ein Mitglied beiden Gruppen sein muß. Ich würde eine Kriterien-Abfrage bevorzugen, aber HQL ist ok auch.

Beachten Sie, dass mit so etwas wie group.id in (1,2) Abfrage wird nicht funktionieren, weil es eine der Gruppen sein kann, nicht beide .

War es hilfreich?

Lösung

Das ist mein einfacher HQL Ansatz:

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) ])

Prost

Andere Tipps

Vielleicht brauchen Sie keine Abfrage. In der Klasse Person ist Mitgliedschaften eine Liste der Mitgliedsobjekte. Sie können feststellen, ob ein Objekt in einer Collection (Liste) ist ohne jede Abfrage zu machen. So etwas sollte die Arbeit machen.

if(Person.memberships.contains(Membership.findByPersonAndGroup(person1,group1)) && Person.memberships.contains(Membership.findByPersonAndGroup(person1,group2))){
  ...do something...
}

Wahrscheinlich ist die andere Lösung simplier, aber ich denke, das ist nur eine weitere Option.

Prost

Groovy Sammlungen

Interessantes Problem. Nicht sicher sind die bisherigen Lösungen Generika auf die Anzahl der gefundenen Gruppen - in den Fällen so weit, es bei 2 fixiert ist, denke ich. Zwar gibt es wahrscheinlich eine Möglichkeit, sie variabel zu machen.

Eine andere Möglichkeit, die ich hier beschreiben auf dem Messageboard Grails - http://www.nabble.com/has-many-through-relationship-query---GORM--td23438096.html

Einschließlich Kommentar des Autors, Robert Fischer, der "Grails Persistence mit GORM und GSQL".

@chadsmall

Hier ist ein weiterer Ansatz, die programmatisch Unterabfragen zu Ihrer WHERE-Klausel anhängen vermeidet zu:

Abfrage:

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)

Und einige Beispielwerte:

[
  groupIds: [8,9,439,86843]
  numOfGroupIds: 4
]

Der Teil dieser Abfrage auf die Gruppe zu allen von den Menschen, die von Greifern, die passen alle der Gruppen. Dann wird durch von Person Gruppierung und Kontrolle der Anzahl der Ergebnisse auf die Anzahl der Gruppen in der Liste gleich ist, können Sie überprüfen, ob diese Person ein Mitglied von allen angegebenen Gruppen ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top