如果它在域类中,请尝试:
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']
Update:
现在我们对您的问题有了更完整的描述,让我们找出解决问题的简化方法。
今天,您想要按事件标题及其日期进行搜索,因此我们将从这里开始,然后看看如何概括这一点并在未来制定更完整的解决方案。
我们的一般流程将是这样的:
- 您向用户显示一个搜索表单
- 用户输入日期和/或标题进行搜索并提交表格
- 您找到匹配的条目
- 您向用户显示匹配的条目
首先,让我们为搜索表单创建一个视图,在 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。如果您还没有创建 EntryController,则可以通过执行“grails create-controller Entry”来完成此操作。
现在,我们将创建两个控制器闭包:
def search = {
render(view:'search')
}
and
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])
}
最后,让我们在 grails-app/views/entry 中创建一个 searchResults.gsp
<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)
从简单的开始并不断改进,您很快就会掌握它的窍门。
祝你好运!