2012-08-02 17 views
3

我有這個的Grails 2.0.3項目,其中有兩種型號DomainADomainB無一不是由many-to-many關係,其中DomainB是相互關聯的一個孩子DomainA的Grails的hasMany:找到孩子一個匹配條件的所有主數據記錄

class DomainA { 
    // properties 
    static hasMany = [domains: DomainB] 
} 

class DomainB { 
    // properties 
    static hasMany = [domains: DomainA] 
    static belongsTo = [DomainA] 
} 

由於這種設計,我想查詢所有DomainB,其中有/設置爲DomainA查詢以下的的DomainA實例(S)。

def domainsList = DomainA.createCriteria().list() { 
    // other criterions for the other properties 
} 
DomainB.createCriteria().list() { 
    inList("domains", domainsList) 
    // other criterions for the other properties 
} 

當執行上面的代碼,錯誤是提示ERROR util.JDBCExceptionReporter - Parameter #1 has not been set.其中Parameter #1是提示在inList準則的domains屬性名稱。

有這個問題,這是可以解決的嗎?怎麼樣?

+1

你有類'DomainA'定義了兩次。你能解決你的問題嗎? – ubiquibacon 2012-08-02 04:23:55

+0

已更新。感謝您的通知。 – 2012-08-02 04:49:02

+0

我認爲'inList'可能不是正確的謂詞:B.domains是一個列表,而不是一個DomainA,所以它永遠不會是由DomainAs組成的列表的成員,對吧? – 2012-08-02 04:54:08

回答

5

GORM guide看看,尋找 「查詢關聯」。讓我們試着用一個查詢來做到這一切。

隨着新 「在哪裏」 查詢,這是

def query = DomainB.where { 
    domains { someAField == 3 } && someBField == 8 
} 

CriteriaBuilder

DomainB.withCriteria { 
    domains { 
    eq 'someAField', 3 
    } 
    eq 'someBField', 8 
} 
3

您可以使用HQL:

def domainBsWithDomainAs = DomainB.executeQuery('SELECT DISTINCT b FROM DomainB b INNER JOIN b.domains a WHERE a IN(SELECT DISTINCT a FROM DomainA a)') 

或者與createCriteria

def domainsList = DomainA.createCriteria().list() { 
    // other criterions for the other properties 
} 
DomainB.createCriteria().list() { 
    "in"("domains", domainsList) // Use "in" (including quotes) instead of inList. 
    // other criterions for the other properties 
} 
+0

我打算使用HQL,但後來有沒有什麼方法可以通過使用'HibernateCriteriaBuilder'來解決這個問題? – 2012-08-02 05:02:50

+0

更新了我的答案。 – ubiquibacon 2012-08-02 05:08:49

+0

是這樣的,那隻會說在DomainB的任何記錄中都沒有'DomainA'的實例。如果我將''HibernateCriteriaBuilder'創建爲'DomainA'並用它在'DomainB'中查詢會怎樣。更新我的問題。 – 2012-08-02 05:57:58

相關問題