高级搜索功能

 

本节中,我们将增加一个对 Member 进行搜索的功能,可以对 Member 的姓名、所在 Team 的名称、性别,进行搜索。如果用户输入的任何一个查询条件为空,则该条件不作为查询条件。

首先实现页面表单。表单并不复杂,只有三个表单项,(可以拷贝 create 页面的代码,然后在上面作修改)代码如下:

<g:form controller="member" method="post" action="search" >
Team Name: <input type="text" id='teamName' name='teamName'/>
Name: <input type="text" id='name' name='name'/>
Gender:
<g:select id='gender' name='gender' from=' ${[""] +
new Member().constraints.gender.inList.collect{it.encodeAsHTML()}}' >
</g:select>
<input type="submit" value="search"/>
</g:form>

这里 Gender 的下拉框也有一个小技巧。new Member().constraints.gender.inList.collect{it.encodeAsHTML()} 会返回数组 ['M', 'F']。由于存在着 Gender 选项可以为空的需求,于是用空数组 [""] 与之相加,得到新的数组 ['','M','F']。从而使下拉框中有三个备选项,第一个为空,另外两个分别是‘M’和‘F’。

显 然,这个表单和数据库中没有直接对应的表,所以不能使用 Domain Class 来直接接收表单。但可以使用 params 来接收,也可以用 Command Object。本文我们使用 Command Object。首先修改创建的文件 SearchMemberCommand.groovy(存放在 src/groovy 下),编辑内容如下:

class SearchMemberCommand {
String teamName
String name
String gender
}

接下来开发 Controller 的 Action,考虑需求,共有三个查询条件,来自两张不同的表,且仅当该条件不为空时可用。这样的复合查询如果使用传统的拼 SQL 的方法实现,需要编写很多代码,但如果使用 Hibernate 的 Criteria,代码会变得很简单而且比较优雅。Grails 提供了一个针对 Hibernate Criteria 的 Builder,由它构造的查询代码,更加优雅,也更加小巧精悍。

这里摘录 search Action 的代码:

def search = { 
//使 Action 获取了页面表单提交的查询条件
SearchMemberCommand searchCmd ->
//如果 request 的请求方式是 POST,则进行查询,否则会输出查询表单
if(request.method == "POST") {
def criteria = Member.createCriteria() //创建了一个 Hibernate 的 Criteria 查询
def resultList = criteria{
and { //所有条件之间是与的关系
//如果 searchCmd.name 不为空,则加入条件
if(searchCmd.name)
like ('name',"%${searchCmd.name}%")
if(searchCmd.gender)
eq ('gender',"${searchCmd.gender}")

//如果 teamName 不为空,则与 team 表进行连接,并加入查询条件
if(searchCmd.teamName) {
team{
like ('teamName',"%${searchCmd.teamName}%" )
}
fetchMode('team', FetchMode.EAGER)
}
}
order("id", "asc") //加入了排序的条件,以 id 字段进行升序查询
}
render(view:"list" , model:[memberList: resultList])
}
}

Critera 的这种查询方式简单而优雅,进一步体现了 Grails 开发的简单与快速。






原创Eclipse插件: 高级搜索功能 - com.realzyc.search.jar Eclipse Plugin 插件 java 全局 搜索 + 特性: 相比与原有eclipse仅支持的在当前文档的搜索功能, 本插件支持了如下的搜索范围: - 当前文档 原有 查找/替换 已支持 - 当前选中 原有 查找/替换 已支持 - 所有打开的文档 原有 查找/替换 不支持 - 当前项目 原有 查找/替换 不支持 - 所有打开的项目 原有 查找/替换 不支持 - 整个工作空间 原有 查找/替换 不支持 仅以在“整个工作空间”搜索为例, 插件提供在整个工作空间(workspace)中的全部文档的搜索.即使项目在关闭状态, 也可以获得搜索结果. + 特性: 本搜索插件提供了“搜索全部”功能, 并将结果全部在列表中显示.用户可以全局通观搜索结果, 并任意的导航的希望的结果.(而不是像原有的功能一样逐一的导航到结果). + 其他: 插件还提供: 字体支持, 中英语言界面切换, 搜索摘要显示等特性. + 本发布包中含有的文件: com.realzyc.search_1.3.5.jar 插件最小执行文档, 不含源文件/javadoc com.realzyc.search.introduction.en.pdf 插件介绍文档, 英文 com.realzyc.search.introduction.cn.pdf 插件介绍文档, 中文 readme.txt 插件介绍摘要 + 声明: 本插件由RealZYC独立开发, 仅用于个人使用. 如果有爱好这方面插件的同志们, 请回复或发邮件联系, 也欢迎大家加入编程Q群(78728985)互相切磋 欢迎大家下载评论.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值