2015-10-15 200 views
3

我有一个简单的Grails应用程序。我有域如下Grails域名字符串查询查询

class Author implements Serializable { 
    .... 
    static hasMany = [ 
     book : Book 
    ] 
} 

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 

} 

现在我有一个要求,在那里我有流派标题的列表,我需要检索所有谁拥有这些类型之一ATLEAST一种书的作者。我需要在Author类中编写一个命名查询。我想下面的查询

hasGenre {cl -> 
    'book.genre.title' in cl 
} 

我传递字符串列表如下

Author.hasGenre(genereTitleStringArray) 

但这似乎并不奏效。我有一些其他简单的命名查询工作正常。所以当我检索包括“hasGenere”时,这似乎不会影响检索。我究竟做错了什么?我是很新的这方面提前

回答

1

您一直在使用列表()方法?如果没有,你必须用它来得到你的namedQuery实体,因为namedQuery返回NamedCriteriaProxy.Class

author = Author.hasGenre(genereTitleStringArray).list() 

对我来说,这样的代码工作不错,在我的作者我有:

static namedQueries = { 
    hasGenre { cl-> 
     'book.genres.title' in cl 
    } 
} 

预订相同。什么流派,你还必须添加依赖一对一的(如果你还没有):

static belongsTo = [book: Book] 

或一对多:

static hasMany= [book: Book] 

对于我目前的代码工作好,运气好。

P.S. 我使用Grails 2.3.11

+0

本书通过懒惰单端关联与Generes关联。这是因为我不想在检索Genere对象时检索书籍。我正在使用Grails 2.2.4。如果我使用查询'Author.hasGenre(genereTitleStringArray).list()',则检索所有记录。 hasGenre方法似乎不会影响检索 – Visahan

+0

我刚刚意识到我已在作者中将定义的标签定义为'Set book',将其更改为'Set book'并且它正在工作。感谢您的帮助 – Visahan

+0

很高兴听到,祝你好运兄弟) –

0

得益于正确的语法将

static namedQueries = { 
     hasGenre {genreName -> 
       book{ 
        genres { 
         eq 'title' genreName 
       } 
      } 
     } 
    } 
+0

我曾尝试使用此语法,它没有工作 – Visahan

+0

,这包括在作者的域名? – Neoryder

+0

是的,在作者域名下,静态namedQueries = { – Visahan