2015-10-16 2 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) 

Но если изменить namedQuery вроде следующего,

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

И если я передаю строку как следующий

Author.hasGenre('genere1') 

Это работает как ожидалось. Есть что-то, что мне не хватает?

Заранее спасибо

ответ

0

Существует заводной в операторе, и я подозреваю, что вместо критериев вы получаете заводной в операторе.

Попробуйте изменить код

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

запятая отсутствует – injecteer

+0

Спасибо, ребята, ответ, который сработал, находится в '' title ', genreNameList – Visahan

+0

спасибо, что injeteer обновит ответ – Neoryder

1

нюанса между критериями запросами и нативными запросами, такими как SQL является то, что критерии запрос не является фактическим запрос. Это запрос builder.

Другими словами, запрос критериев не запустил в том же смысле, что и SQL-запрос, запущенный в базе данных SQL. Вместо этого запрос критериев выполняется до , генерирует запрос базы данных. Имея это в виду, легче понять, что пошло не так.

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

Выражение 'title' in genreNameList возвращает логическое значение. Он не влияет на запрос критериев, потому что не вызывается ни один из методов построения запроса критерия. Поэтому в итоге запрос построен для возврата всего.

Эквивалент ключевого слова Groovy в критерии запроса - это метод 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' ...).

Смежные вопросы