Если это в доменном классе, попробуйте:
def matches = Book.findAllByTitleLike("wonderful")
из, если вы не хотите беспокоиться о верхнем / нижнем регистре:
def matches = Book.findAllByTitleILike("wonderful")
Если названия ваших книг в коллекции:
def books = ['Wonderful Tonight', 'Atlas Shrugged', 'A Tale of Two Cities']
def matches = books.findAll{it.indexOf("wonderful") > -1} // returns []
matches = books.findAll{it.indexOf("Wonderful") > -1} // returns ['Wonderful Tonight']
matches = books.findAll{it.toLowerCase().indexOf("wonderful") > -1} // returns ['Wonderful Tonight']
Обновление:
Итак, теперь, когда у нас есть более полное описание вашей проблемы, давайте найдем упрощенный способ ее решения.
Сегодня вы хотите выполнить поиск по названию события и его дате, поэтому мы начнем там, а затем посмотрим, как можно обобщить это и сделать более полное решение в будущем.
Наш общий поток будет примерно таким:
- Вы отображаете форму поиска для своего пользователя
- Пользователь вводит дату и / или заголовок для поиска и отправляет форму
- Вы найдете подходящие записи
- Вы отображаете соответствующие записи для пользователя
Сначала давайте создадим представление для формы поиска в grails-app / views / entry / и создадим файл с именем search.gsp со следующим содержимым:
<g:form controller='entry' action='searchResults'>
Entry Title: <g:textField name="title" value="${title}" />
Entry Date: <g:datePicker name="day" value="${day}" precision="day" />
<g:submitButton name="submit" value="Search" />
</g:form>
Далее мы создадим контроллер. В grails-app / controllers / создайте новый контроллер EntryController.groovy. Вы можете сделать это, выполнив «запись grails create-controller», если EntryController еще не создан.
Теперь мы создадим два замыкания контроллера:
def search = {
render(view:'search')
}
и
def searchResults = {
def entryCriteria = Entry.createCriteria()
def results = entryCriteria.list {
if(params?.title) {
ilike{"title","%${params.title}%"
}
if(params?.day) {
eq("eventDate", params.day)
}
}
render(view:'searchResults', model:['results':results])
}
Наконец, давайте создадим searchResults.gsp в grails-app / views / entry
<h1>Results</h1>
<g:each in=${results}>
${it}
</g:each>
Итак, теперь собираем все вместе:
- Запустите ваше приложение и перейдите по адресу localhost: 8080 / $ {appName} / entry / search, и это должно вызвать вашу форму поиска.
- Введите заголовок и / или дату, отправьте форму, которая должна отправить данные вашей формы в замыкание searchResults в вашем контроллере
- Поиск критериев в закрытии найдет все записи, соответствующие вашим критериям поиска
- Вы визуализируете представление результатов поиска и передаете ему соответствующие записи, затем в gsp мы перебираем каждый из результатов и отображаем его.
Как заявление об отказе, я пишу этот код на лету в текстовом редакторе переполнения стека, поэтому я не удивлюсь, если есть пара синтаксических проблем, которые я пропустил. Надеюсь, объяснений будет достаточно, чтобы вы пошли. Теперь давайте поговорим о том, чтобы взять этот базовый пример и довести его до более приемлемого решения.
Я бы порекомендовал вам попробовать сделать следующее после ознакомления с базовым примером:
- Попробуйте создать командный объект для представления формы поиска, это позволит вам проверить правильность ввода вашего пользователя и является более управляемым подходом, чем прямая работа с параметрами запроса, как я делал выше.
- Создайте несколько модульных тестов для вашего командного объекта и потока контроллера; убедитесь, что сообщения об ошибках заполняются для различных проверок.
- Возьмите критерий поиска, который мы определили в замыкании searchResults, и переместите его в отдельную службу Grails, передайте объект командной строки в службу для получения результатов. Затем вы можете повторно использовать функцию поиска, если она вам понадобится позже в вашем приложении.
- Создайте несколько юнит-тестов для вашего сервиса; макет объекта домена Entry и убедитесь, что ваша функция поиска работает правильно.
Если вы изо всех сил пытаетесь заставить работать вышеупомянутое решение, попробуйте упростить его еще больше. Исключите поиск даты и просто поиск по названию. Замените всю логику критериев в действии searchResults на:
def results = Entry.findByTitleILike(params?.title)
Начните с простого и улучшайте, и вы быстро освоитесь.
Удачи!