Grails findAll с одинаковыми значениями - PullRequest
1 голос
/ 27 февраля 2012

Попытка просто выполнить запрос объектов домена, используя find all, и это не работает так, как я ожидал:

searchResults = Contact.findAll("from Contact as c where c.company=${params.company.id} and c.firstName = '%${nameSearch}%'  or c.lastName = '%${nameSearch}%' ")

Я хочу найти всех людей в компании, которые имеют имя или фамилиюаналогично введенному поиску (params.search был сохранен в переменной nameSearch).Если я изменяю значение для first или last на определенное имя «Tim» или «Johnson», оно работает.

Что я делаю неправильно с переменной или ссылкой «like»?Я думал, что символ% был в основном символом * в критериях поиска?

Я пробовал 2.0.0 форму поиска:

        searchResults = Contact.findAll{
            company == params.company.id
            firstName == '%' + nameSearch + '%'
            lastName == '%' + nameSearch + '%'
        }

Но это тоже не сработало.Спасибо за помощь

1 Ответ

7 голосов
/ 27 февраля 2012

Попробуйте:

def company = Company.get(params.company.id)
def searchResults = Contact.withCriteria {
    eq('company', company)
    or {
        ilike('firstName', '%' + nameSearch + '%')
        ilike('lastName', '%' + nameSearch + '%')
    }
}

Если вы не хотите извлекать экземпляр Company, вы можете использовать idEq() в блоке company { }.

Несколько вещей (возможно, даже больше), которые были неверны в вашей попытке HQL:

  • Ваше условие company сравнивало объект (c.company) со значением id (params.company.id))
  • Вы должны были правильно сгруппировать логическую логику, то есть (company AND (first OR last)) вместо (company AND first OR last)
  • Вы должны были использовать like вместо =, например firstName like '%something%'

В целях безопасности , вам действительно не следует строить HQL-оператор со встроенными значениями .Вместо этого вы должны использовать именованные параметры.Посмотрите некоторые средние примеры в findAll документации .

...