Почему findAllBy * терпит неудачу при использовании трех условий в Grails / GORM? - PullRequest
4 голосов
/ 22 июня 2009

Рассмотрим следующие применения метода динамического поиска Grails / GORM findAllBy *:

def foo1 = Foo.findAllByYear(yyyy)
def foo2 = Foo.findAllByMonth(mm)
def foo3 = Foo.findAllByDay(dd)
def foo4 = Foo.findAllByYearAndMonth(yyyy, mm)
def foo5 = Foo.findAllByYearAndDay(yyyy, dd)
def foo6 = Foo.findAllByYearAndMonthAndDay(yyyy, mm, dd)

println "# foo1=${foo1.size()} foo2=${foo2.size()} foo3=${foo3.size()}"
println "# foo4=${foo4.size()} foo5=${foo5.size()} foo6=${foo6.size()}"

Первые пять из этих динамических искателей работают как ожидалось.

Однако шестой сбой с InvalidPropertyException («Не найдено свойство для имени [yearAndMonth] для класса [class foo]»).

Вопрос:

Почему не работает шестой? Разве findAllBy * не может обрабатывать более двух условий? Решение / обходным

Ответы [ 2 ]

11 голосов
/ 24 июня 2009

Ответ Теда верен, но причина , почему Grails не поддерживает более 2 предикатов, заключается в том, что если все соединения не совпадают, тогда неясно, каково намерение.

Или простым английским языком ...

  • Очевидно, что findAllByYearAndMonthAndDay(1999,2,3) означает
  • Также очевидно, что findAllByYearOrMonthOrDay(1999,2,3) означает
  • Но не очевидно, что findAllByYearOrMonthAndDay(1999,2,3) означает

Однако, если все соединения одинаковы (все and с или все or с), то нет причин, по которым более 2 предикатов не могут поддерживаться. На самом деле, если вы будете искать в Grails JIRA, вы обнаружите, что проблема уже открыта. Проголосуйте за это, если вы сильно к этому относитесь.

Кстати, плагин IntelliJ Grails ошибочно обеспечивает завершение кода для динамических искателей с более чем 2 предикатами.

Решение / обходной путь - просто написать запрос Criteria или использовать вместо него HQL.

4 голосов
/ 23 июня 2009

Нет, не сейчас. На данный момент это ограничено 2 условиями. Для более чем 2 посмотрите на построитель критериев или методы findAllWhere.

...