Есть ли в GORM эквивалент «не в»? - PullRequest
7 голосов
/ 06 августа 2010

Можно ли конвертировать в createCriteria ()?

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

Я знаю, что есть оператор 'in' и вот что у меня есть:

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

Просто хочу посмотреть, возможно ли это. В противном случае, я думаю, это возможно в HQL, верно?

Ответы [ 5 ]

19 голосов
/ 06 августа 2010

спасибо Sammyrulez за код. есть идея из этого. проверил это, но это не сработало. я исправил это и вот окончательный рабочий код:

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

Теперь я знаю, как использовать оператор «не». Большое спасибо!

8 голосов
/ 06 августа 2010

сам не пробовал, но, глядя на документацию Grails и API hibernate, вы создаете узлы на этой карте компоновщика с помощью статических методов, найденных в классе Restrictions API Hibernate Criteria 1 .Так что-то вроде

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

Поскольку вы связываете метод in (который возвращает критерий) с методом not (который принимает критерий в качестве аргумента и возвращает отрицательную версию)

1 голос
/ 06 января 2016

Просто помните: в этом случае вам не нужно использовать скобки, и вы можете использовать inList, например:

not { inList 'age',[18..65] }
1 голос
/ 11 июня 2013

Согласно документации Grails о создании критериев здесь , вы можете использовать что-то вроде этого:

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

В этом примере у вас есть свойство с именем "age", и вы хотитеполучить строки, которые НЕ находятся между 18 и 65. Конечно, часть [18..65] может быть заменена любым списком значений или диапазоном, который вам нужен.

1 голос
/ 14 мая 2013

это решение:

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)
                }
            }
        }
...