Grails GORM (Hibernate) запрос - PullRequest
       12

Grails GORM (Hibernate) запрос

2 голосов
/ 30 марта 2010

Я пытаюсь сделать приведенный ниже SQL-оператор в GORM

select * from table1 where table1.x not in
      (select x from table 2 where y='something');

Итак, у меня есть две таблицы, и мне нужно найти записи из таблицы 1, которых нет в таблице 2. В Grails

def xx= table2.findByY('something')
    def c = table1.createCriteria()
    def result= c.list {
      not (
        in('x', xx)
    )
}

синтаксис неправильный, и я не уверен, как имитировать не в sql логике.

В качестве учебного пособия, если кто-то может также сказать мне, почему оператор минус (-) в grails / groovy не работает со списком. Я пытался получить x и y отдельно и делать x.minus (y), но это не меняет список. Я увидел объяснение в Groovy в списке Grails - не работает? , но я ожидаю, что список определен локально.

Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 30 марта 2010

Хм, я сам только изучаю GORM, но вижу одно: в - зарезервированное слово в groovy, поэтому его нужно экранировать как 'в'

2 голосов
/ 30 марта 2010

Ладно .. приступил к работе .. всем интересно ..

Стивен был прав, вы должны уйти с «в», так как это зарезервированное слово. Синтаксис:

def c = table1.createCriteria()
    def result= c.list {
      not {
        'in'("x", xx)
//xx could be a list, array etc. eg: [1,2,3]
    }
}
0 голосов
/ 13 августа 2016

Начиная с Grails 2.4, вы можете написать этот запрос как отдельный запрос, используя подзапрос через notIn & DetachedCriteria(where):

и у нас есть два синтаксиса :

@java.lang.Override public Criteria notIn(java.lang.String propertyName, QueryableCriteria<?> subquery)

@java.lang.Override public Criteria notIn(java.lang.String propertyName, groovy.lang.Closure<?> subquery)

В вашем случае должно работать следующее:

def c = Tabl1.createCriteria().list {
              notIn 'x',Table2.where { eq('y','something') }.projections {
                     property 'x'
                     }.list()
    } 
...