2012-05-10 83 views
0

我無法找出一個GORM查詢的對象上匹配多個協會:的Grails GORM查詢匹配多個關聯對象

class Zoo { 
    String name 
    static hasMany = [animals:Animal] 

    static namedQueries = { 
     // SEARCH1 match any of a list of animals 
     searchOr { searchAnimals -> 
      or { 
       searchAnimals.each { name -> 
        animals { 
         eq('name', name) 
        } 
       } 
      } 
     } 

     // SEARCH2 match ALL of a list of animals 
     searchAnd { searchAnimals -> 
      and { 
       searchAnimals.each { name -> 
        animals { 
         eq('name', name) 
        } 
       } 
      } 
     } 
    } 
} 

class Animal { 
    String name 
} 

搜索1會很樂意與任何動物名單的匹配動物園,但是應該如何編寫SEARCH2才能獲得動物園,這些動物園中的所有動物都在提供的列表中?

+0

當你移動和searchAnimals.each {}時會發生什麼{} –

+0

@jonaldomo我認爲現在的'和'是隱含的,因此它是不必要的。將它移動到'searchAnimals.each {}'中,隱含的'和'將仍然存在,新的'和'將僅應用於單個語句。雖然不能傷害嘗試 - 會讓你知道發生了什麼。 – Alex

回答

1

我不知道GORM,我不知道一個完整的解決方案,但我認爲目前的SEARCH2查詢有什麼問題以及可能會有什麼幫助。目前的searchOr是這樣的:

WHERE ANIMAL.NAME = 'bear' 
    OR ANIMAL.NAME = 'bird' 
    OR ANIMAL.NAME = 'puma' 

這會很好用。該searchAnd是這樣的:

WHERE ANIMAL.NAME = 'bear' 
    AND ANIMAL.NAME = 'bird' 
    AND ANIMAL.NAME = 'puma' 

這不能給出正確的結果,因爲任何單一的動物不能被熊和一隻鳥,並在同一時間美洲獅。

你所尋找的是這樣的:

WHERE EXISTS (SELECT FROM ANIMAL A WHERE A.ZOO = Z.ID AND A.NAME = 'bear') 
    AND EXISTS (SELECT FROM ANIMAL A WHERE A.ZOO = Z.ID AND A.NAME = 'bird') 
    AND EXISTS (SELECT FROM ANIMAL A WHERE A.ZOO = Z.ID AND A.NAME = 'puma') 

但我不知道有足夠的瞭解GORM能夠以這種方式制定的查詢。從我讀的有detached criteriaexists方法。但也許這是不可能的,除非使用Hibernate Query Language

+0

感謝您幫助澄清問題 - 應幫助我找出是否有解決方案:¬) – Alex