2010-03-30 61 views
2

我試圖做下面的SQL語句在格姆的Grails 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 on Grails list - not working?看到了一個解釋,但我希望定義的列表是本地的。

非常感謝。

+0

我看到了如何在http://www.grails.org/GORM+-+Querying上使用HQL查詢,但更喜歡瞭解條件語法。謝謝 – bsr 2010-03-30 03:14:03

回答

5

嗯,我剛學格姆自己,但有一件事我看到的是,在 Groovy中的保留字,因此需要「在」被轉義爲

+0

你說得對,那是一個關鍵字,但我無法逃脫,如上所述。我使用了Restrictions.in(import org.hibernate.criterion.Restrictions),並且語法正常。我仍然無法得到邏輯工作。我認爲有一個「添加」關鍵字加入而不是,但不能讓它工作。希望有人會指出我正確的方向。感謝你的幫助 – bsr 2010-03-30 04:29:32

2

好了..工作..有興趣的人..

斯蒂芬是正確的,你必須逃避in'in',因爲它是一個保留字。語法是。

def c = table1.createCriteria() 
    def result= c.list { 
     not { 
     'in'("x", xx) 
//xx could be a list, array etc. eg: [1,2,3] 
    } 
} 
0

因爲Grails的2.4,你可以通過notIn & DetachedCriteria(where)編寫使用子查詢該查詢作爲一個查詢:

&我們有two syntax

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