Граальи находят объекты по многим параметрам - PullRequest
1 голос
/ 04 марта 2011

У меня довольно большая форма, где пользователь может выбрать любое количество параметров (от 1 до 10).

Пример:

  1. Города - NYC, LA;возраст - 18
  2. города - ноль (ничего не выбрано);age - 23, 57

Как мне реализовать метод find на уровне GORM (неверный способ - метод, который составляет строку запроса, добавляет параметры, если не ноль, и т. д.)?

Затем я должен искать в своей базе данных соответствующие объекты.Еще одно ограничение - следует использовать executeQuery ?

** [EDITED] *** Я вспомнил, что не опубликовал свой ответ.Вот оно:

    def resultList = Organization.createCriteria().list(max: params.max, offset: params.offset) {
        and {
            if (params.chosenNomenc != null) {
                nomenclatures {
                    ilike("title", params.chosenNomenc)//for string
                }
            }
            if (params.chosenCountries != null) {
                countries {
                    'in'("title", params.chosenCountries)//for list
                }
            }              
            cache true
            order("id", "asc")
        }
    }
    println("resultList:" + resultList)
    [organizationList: resultList, total: resultList.totalCount, params: params]
}

С уважением, Дмитрий.

Ответы [ 4 ]

4 голосов
/ 04 марта 2011

Лучше всего использовать критерии в контроллере.

    def locProps = Location.metaClass.properties*.name
    def locs = Location.withCriteria {
        and {
            params.each { field, value ->
                if (locProps.grep(field) && value) {

                    // more checks here
1 голос
/ 04 марта 2011

Используйте API Criteria, и при его закрытии вы можете использовать условные операторы (если / еще) для его построения на основе наличия параметров.

0 голосов
/ 05 марта 2011

Я предлагаю пользователю createCriteria или withCriteria только.
Давайте возьмем пример:
Если параметры для действия такие, как вы задали:
1) Города - Нью-Йорк, Луизиана; возраст - 18
2) Города - ноль (ничего не выбрано); возраст - 23, 57

И предположим, что класс вашего домена равен User, тогда:

def result = User.withCriteria (max: params.max){
   if (params.Cities)
        eq('city', params.Cities)
   if (params.age)
        eq('age', params.age)
}

Возвращает список подходящих объектов класса домена User.
Для получения более подробной информации, пожалуйста, посмотрите createCriteria или withCriteria в документации Grails.

0 голосов
/ 05 марта 2011

При условии, что ваши

Person.withCriteria {
  if (params.list('ages')) { // inList('fieldName', null) causes an error
    inList 'age', params.list('ages')
  }
  if (params.list('cities')) {
    inList 'city', params.list('cities')
  }
}
...