2010-08-06 4 views
7

Kann dies in createCriteria() konvertiert werden?Gibt es in GORM ein "nicht in" Äquivalent?

SELECT * FROM node WHERE (node.type = 'act' AND nid NOT IN (SELECT nid FROM snbr_act_community)) LIMIT 10 

Ich weiß, es ist ein ‚in‘ Operator und hier ist, was ich habe, so weit:

def c = VolunteerOpportunity.createCriteria() 
def matchingActs = c.list { 
    node { 
     eq('type', 'act') 
    } 
    maxResults(10) 
} 

sehen will nur, wenn dies möglich ist. Ansonsten denke ich, das ist in HQL möglich, oder?

Antwort

19

dank Sammyrulez für den Code. habe eine Idee davon. getestet, aber es hat nicht funktioniert. i es fest, und hier ist der letzte Arbeitscode:

def ids = [14400 as long, 14401 as long] 

def c = VolunteerOpportunity.createCriteria() 
def matchingActs = c.list { 
    node { 
     eq('type', 'act') 
     not { 'in'(ids) } 
    } 
    maxResults(10) 
} 

jetzt weiß ich, wie zu verwenden ‚nicht‘ Operator. Danke vielmals!

8

nicht selbst getestet, aber mit Blick auf die Grails doc und hibernate api erstellen Sie Knoten auf dieser Builder-Map mit den statischen Methoden in der Restrictions-Klasse der Hibernate Criteria API 1 gefunden. So etwas wie

def c = VolunteerOpportunity.createCriteria() 
def matchingActs = c.list { 
    node { 
     not(in('propertyName', ['val1','val2'])) 
    } 
    maxResults(10) 
} 

Da Sie die in Methode Kette mit der nicht-Methode (dass ein Kriterium zurückzugibt) (das Kriterium als Argument verwendet und eine negierte Version)

+3

Dank für den Beispielcode. habe eine Idee, wie man 'nicht' Operator benutzt. – firnnauriel

1

das ist die Lösung:

def resultat=EnteteImputationBudgetaire.createCriteria().get{ 
      between("dateDebutPeriode", dateDebut, dateFin) 

      and{ eq 'natureImputationBudgetaire','FONCTIONNEMENT' } 
      maxResults(1) 
     } 

     def resultat2=ParametragePlanBudgetaire.createCriteria().list() { 
      like('composantBudgetaire','6%') 
      if(resultat?.details) { 
       not { 
        'in'('composantBudgetaire',resultat?.details?.imputationBudgetaire) 
       } 
      } 
     } 
1

Nach Grails Dokumentation über here Kriterien erstellen, können Sie so etwas wie dieses verwenden:

not {'in'("age",[18..65])} 

In diesem Beispiel haben Sie eine Eigenschaft mit dem Namen "age" und Sie möchten Zeilen, die NICHT zwischen 18 und 65 liegen. Natürlich kann der [18..65] Teil durch eine beliebige Liste von Werten oder Bereichen ersetzt werden, die Sie benötigen.

1

Nur Erinnerung: In diesem Fall müssen Sie nicht Klammer verwenden, und Sie können inList verwenden, zum Beispiel:

not { inList 'age',[18..65] } 
Verwandte Themen