2016-04-01 8 views
0

Ich habe zwei GORM-Domain-Klassen. Einer ist eine Karte und die Karte hat viele Einkäufe darauf. Gibt es irgendeine Möglichkeit, nach Karten zu suchen, die bestimmte Einkäufe größer oder gleich haben? Hier könnte ein Beispiel seinGrails hasmany Suche nach genauen Artikel von hasmany

Wir haben 4 Karten:

Card1: orange, orange, apple Card2: Apfel, Orange Card3: orange, orange Card4: Apfel, Apfel, Orange

Lets sag ich wollte nach allen Karten suchen, die 2 oder mehr Orangen haben. damit würde nur Karten 1,3 zurückgeben. Die Suche basiert auf dem Namen des Kaufs.

+1

Sie können das mit Unterabfragen tun, siehe 'DetachedCriteria' in der Dokumentation – droggo

Antwort

0

Angenommen, Ihre Domain-Klassen sind so etwas wie dieses ...

class Card { 
    static hasMany = [purchases: Purchase] 
} 

class Purchase { 
    String name 
} 

Hier ist, wie Sie es tun können:

def cards = Card.withCriteria { 
    resultTransformer = org.hibernate.Criteria.DISTINCT_ROOT_ENTITY 

    sizeGe('purchases', 2) 

    purchases { 
     eq('name', 'orange') 
    } 
} 

Statt eine Unterabfrage zu verwenden, können Sie sizeGe() verwenden, die die Anzahl zählt von Artikeln in einer Sammlung und sucht nach einer Zählung, die größer oder gleich der angegebenen Anzahl ist.

Das Hinzufügen der eq() zur Abfrage führt jedoch dazu, dass das Ergebnis aufgrund der Gruppierung doppelte Einträge enthält. Ein Nebeneffekt hätte eine Unterabfrage nicht. So filtert der DISTICT_ROOT_ENTITY Ergebnistransformator die Duplikate nach der Tat heraus.

Sie können mehr über Kriterienabfragen in meinen Artikeln here erfahren.

+0

Eigentlich sieht das so aus, als ob nur einer der Käufe orange sein muss. Kann ich sagen, dass mindestens zwei von ihnen orange sind? – moloch101

+0

Ja ... das ist ein viel komplizierteres Problem. Ich habe diese Frage einige Male beantwortet. Ich denke, das ist die beste Lösung, die ich bisher gefunden habe: http://stackoverflow.com/questions/32856121/grails-how-to-best-construct-a-hibernate-criteria-builder-to-search-hasmany/32872048 # 32872048 –

+0

Ehrfürchtig. Das hat geholfen, mehrere gleiche Einkäufe zu bekommen, aber ich habe immer noch ein Problem. Ich versuche, executeQuery zweimal zu verwenden, dann die Schnittmenge der zwei Sätze zu finden, also können Benutzer mehrere Käufe spezifizieren, aber wenn ich versuche, executeQuery zweimal zu tun, gibt es die erste Suche zurück, wenn ich es ein zweites Mal versuche. Irgendeine Idee was ist los? – moloch101

Verwandte Themen