Проблемы с использованием Domain.findBy [свойство] с автономной GORM - PullRequest
0 голосов
/ 04 января 2019

Я работаю с проектом, использующим GORM, вообще без Grails, и у меня возникают проблемы, когда я пытаюсь сделать findByX. Например, когда я пытаюсь

Country.findByName ( "Канада")

Проект не компилируется, и он дает мне

Ошибка: (80, 9) Groovyc: [Проверка статического типа] - Не удается найти соответствующий метод app.domain.location.Country # findByName (java.lang.String). Пожалуйста, проверьте правильность заявленного типа и существует ли метод.

Даже если поле Имя существует.

Однако в CountryService.groovy я могу определить метод findByName следующим образом:

@Where({ name == countryName })
static Country findByName(String countryName){
    Country.findAll().first()
}

Но я не думаю, что это хорошая практика.

Подводя итог, есть ли зависимость, конфигурация или что-то еще, что мне нужно для выполнения запросов GORM, таких как Domain.findByX ()? Или это невозможно с помощью GORM Standalone?

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

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Использование службы данных, безусловно, хорошая идея, хотя ваш пример лучше написать в виде interface, а не class, без реализации или аннотации @Where и без статичности.

@Service(Country)
interface ICountryDataService {
    Country findByName(String name)
}

Параметр в определении метода должен иметь то же имя, что и поле в классе домена. Пока возвращаемое значение не является коллекцией, оно вернет первое найденное.

Аннотация @Where полезна, когда запрос усложняется:

@Service(Country)
interface ICountryDataService {
    @Where({ name ==~ pattern })
    List<Country> searchCountriesByPattern(String pattern)

    Country findByName(String name)
}
0 голосов
/ 04 января 2019

Ваша проблема не в том, что метод GORM не существует (в конце концов); это то, что он не существует во время компиляции, и вы, похоже, используете @CompileStatic (или ваш проект настроен там, где это по умолчанию).

Из документации Grails (в которой говорится о Gorm и CompileStatic): https://docs.grails.org/latest/guide/staticTypeCheckingAndCompilation.html

Одним из ограничений использования CompileStatic является то, что при его использовании вы даете доступ к мощности и гибкости, предлагаемой динамической диспетчеризацией. Например, в Grails вы не сможете вызвать динамический GORM искатель из класса, который помечен CompileStatic, потому что Компилятор не может проверить, что метод динамического поиска существует, потому что он не существует во время компиляции.

Если вы хотите использовать динамические искатели GORM, вам необходимо отключить @CompileStatic для метода / класса, использующего эти искатели. Поэтому удалите аннотацию @CompileStatic или добавьте @CompileDynamic

Другие соответствующие:

...