2015-10-16 45 views
3

我有一個Grails應用程序(2.2.4)。凡在域類我看起來像這樣Grails命名查詢不適用於「in」語句

class Author implements Serializable { 
    .... 
    static hasMany = [ 
    book : Book 
    ] 
    static namedQueries = { 
     hasGenre {genreNameList -> 
      book{ 
       genres { 
        'title' in genreNameList 
      } 
     } 
    } 
    } 
} 

class Book implements Serializable{ 

    Author author 
    Genres genres 
    static belongsTo = [author: Author , genre: Genres ] 
     static mapping = { 
     ..... 
     author lazy: false 
     } 
} 

class Genres implements Serializable{ 

    String title 

} 

如果我運行查詢,如下,所有的值進行檢索,而不是隻在genereNameList

String comaSeperatedGenereName = "genere1,genere2" 
def genereNameList = comaSeperatedGenereName.split(",") 
Author.hasGenre(genereNameList) 
的用於至少一個書genere作者

但如果我改變namedQuery像下面,

 hasGenre {genreName -> 
      book{ 
       genres { 
        eq 'title' , genreName 
      } 
     } 

,如果我傳遞一個字符串像下面

Author.hasGenre('genere1') 

這個按預期工作。有什麼我失蹤?

在此先感謝

回答

0

有在運營商Groovy和我懷疑的,而不是在你的標準獲得常規的操作。

試着改變你的代碼

static namedQueries = { 
     hasGenre {genreNameList -> 
      book{ 
       genres { 
       'in' 'title', genreNameList 
      } 
     } 
    } 
    } 
+0

逗號缺失 – injecteer

+0

感謝球員,工作的答案是'在''標題',genreNameList – Visahan

+0

謝謝injeteer將更新答案 – Neoryder

1

一個細微標準的查詢和本地查詢之間,如SQL是一個標準的查詢是不實際的查詢。這是一個查詢builder

換句話說,與SQL查詢在SQL數據庫中運行同樣,標準查詢不會運行。相反,一個標準查詢被執行到,生成一個數據庫查詢。考慮到這一點,很容易看出哪裏出了問題。

hasGenre {genreNameList -> 
    book{ 
     genres { 
      'title' in genreNameList 
     } 
    } 
} 

表達式'title' in genreNameList返回布爾值。它對標準查詢沒有影響,因爲沒有標準查詢的構建器方法被調用。所以最終查詢的結果是返回所有內容。

標準查詢中關鍵字的Groovy's等效方法是in()方法。

hasGenre {genreNameList -> 
    book{ 
     genres { 
      'in'('title', genreNameList) 
     } 
    } 
} 

這構建了您所期望的查詢。但是,因爲in是Groovy中的關鍵字,所以爲了執行該方法,必須引用它的名稱。我認爲一個更美觀的方法來完成同樣的事情是inList()方法。

hasGenre {genreNameList -> 
    book{ 
     genres { 
      inList('title', genreNameList) 
     } 
    } 
} 

最後,爲了更好地說明構建器的概念,下面是實現同樣事情的更詳細的方法。

hasGenre {genreNameList -> 
    book{ 
     genres { 
      or { 
       genreNameList.each { 
        eq('title', it) 
       } 
      } 
     } 
    } 
} 

該查詢通過對每個流派標題調用eq()來構建。最終結果是具有多個連詞(例如title ='foo'或title ='bar'...)的查詢。