Метод findAll() в Grails ведет себя неправильно при использовании предложений and и or

Почему предложения «и» и «или» не работают внутри метода findAll() в Grails?

Например, этот код:

Student.findAll {
   and {
      name == "A"
      name ==~ "%A" 
   }
}.collect { it.name }

сгенерирует список:

['AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ']

что неправильно. Он не должен был ничего генерировать. Ни одна из записей не соответствует условию, имеющему точное имя «А» и окончание «А». Показанная строка содержит ВСЕ записи в моей таблице Student.

Становится немного хуже. Этот код:

Student.findAll {
   or {
      name == "A"
      name ==~ "%A" 
   }
}.collect { it.name }

генерирует тот же список:

['AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ']

когда на самом деле должна была вернуться только запись «АА».

Что-то не так с этим кодом?

Спасибо!


person hernandezjd    schedule 06.02.2013    source источник


Ответы (1)


Используйте обычные логические операторы в критериях, например:

Student.findAll {
    name == "A" && name ==~ "%A" 
}.collect { it.name }

Student.findAll {
    name == "A" || name ==~ "%A" 
}.collect { it.name }
person ataylor    schedule 06.02.2013
comment
Спасибо. Я как бы нашел это решение, но хотел бы знать причины. Почему и и или не работают? - person hernandezjd; 06.02.2013
comment
Критерии findAll используют синтаксис выражений, представленный в запросах where, а не построитель критериев. - person ataylor; 06.02.2013
comment
Разве Grails не должен в какой-то момент жаловаться на использование предложений? Это действительно вызывает ошибки, которые трудно найти. Спасибо за вашу помощь! - person hernandezjd; 06.02.2013