xyzone 发表于 2014-5-22 22:39:04

开发指南专题七:JEECG微云快速开发平台查询HQL过滤器

开发指南专题七:JEECG微云快速开发平台 HQL过滤器





1. 查询HQL过滤器




1.1. 数据过滤现状分析

项目开发的查询页面都会有很多查询条件,开发追加查询条件的工作繁琐又很浪费时间。

这块工作量主要在:页面加查询字段和后台代码逻辑判断,追加查询条件;

目前JAVA持久层主流框架Hibernate和Ibatis实现方式分析:

.Hibatente 技术实现:

A.页面追加查询字段;

B.后台代码需加逻辑判断,判断字段是否为空,手工拼SQL追加查询条件;

.IBATIS 技术实现:

A.页面追加查询字段;

B.后台不需写代码,但是需在XML文件中追加该字段非空判断和查询条件;

特点:常规功能的页面查询方式只能是"全匹配"和"模糊查询",对于特殊的 "包含查询"和"不匹配查询",只能写特殊逻辑代码

1.2.查询条件SQL生成器

1.2.1. 实现原理

根据页面传递到后台的参数,动态判断字段是否为空,自动拼SQL追加查询条件。

实现的功能:实现了"模糊查询" , "包含查询" , "不匹配查询" 等SQL匹配功能。

特点:页面仅仅追加一个查询字段,后台不需要写任何代码,查询功能自动实现。

1.2.2. 查询规则

要求:页面查询字段,需跟后台Action(或Controller)中Page的字段对应一致,后台不需写代码自动生成HQL,追加查询条件;默认生成的查询条件是全匹配;

查询匹配方式分类:

.全匹配查询:查询数据没有特殊格式,默认为全匹配查询

.模糊查询:查询数据格式需加星号[*]   例如:{MD*/*MD*/*M*D*}

.包含查询:查询数据格式采用逗号分隔[,]例如: {01,03}(含义:in('01','03'))

.不匹配查询:查询数据格式需要加叹号前缀[!] 例如:{!123}(含义:不等于123)

特殊说明:查询不为Null的方法=!null(大小写没关系);查询不为空字符串的方法=!(只有一个叹号).

.时间范围范围查询

jsp 页面中使用的name:需要查询的日期类型字段名本身(什么都不加),表示查询时查询等于该字段时间的数据

begin:需要查询的日期类型字段名(首字母大写),表示查询开始时间 查询时查询大于等于开始时间的数据

end: 需要查询的日期类型字段名(首字母大写),表示查询结束时间查询时查询小于等于结束时间的数据

使用举例:

字段名称 private Date birthday

查询开始时间 beginBirthday

查询结束时间 endBirthday

1.2.3. 具体实现

第一步:页面实现

说明:为dategrid字段,追加属性 query="true",自动加载出查询框,如图51所示。

http://img.blog.csdn.net/20140514202930109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
第二步:controller层处理

Controller中对应的处理逻辑如图52所示。
http://img.blog.csdn.net/20140514203025093?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
1.3查询过滤器高级特性


dategrid中的查询过滤器默认是单条件查询,即在设置多个dgCol的query=”true”之后,查询条件中同时只能有一个条件被使用,生成的页面效果如图53所示。

http://img.blog.csdn.net/20140514203303031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
当然,可以通过dategrid和dgCol的参数设置来达到更高级的查询过滤功能,如组合查询条件和值范围查询。1.3.1. 组合条件查询

设置<t:dategrid>标签的queryMode=”group”(该参数值默认为”single”,即单条件查询),在页面生成时,会生成一个组合查询条件输入面板。生成的页面效果如图54所示。

http://img.blog.csdn.net/20140514203439984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
1.3.2. 字段范围查询


设置<t:dgCol>标签的queryMode=”group”,在页面生成时,会生成一个范围输入框。生成的页面效果如图54所示。

http://img.blog.csdn.net/20140514203545593?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
图55字段范围查询效果

字段范围查询会为该字段生成两个输入框,name分别为“字段名_begin”和“字段名_end”,具体的查询功能需要在后台接收这两个输入框的内容,并把查询条件加入到HQL中。示例如下:




@RequestMapping(params = "datagrid")

public void datagrid(JeecgDemo jeecgDemo,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) {

CriteriaQuery cq = new CriteriaQuery(JeecgDemo.class, dataGrid);

   //查询条件组装器

   org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, jeecgDemo);

   String ctBegin = request.getParameter("createTime_begin");

   String ctEnd = request.getParameter("createTime_end");

   if(ctBegin!=null && ctEnd!=null){

   try {

   cq.ge("createTime", new SimpleDateFormat("yyyy-MM-dd").parse(ctBegin));

   cq.le("createTime", new SimpleDateFormat("yyyy-MM-dd").parse(ctEnd));

} catch (ParseException e) {

e.printStackTrace();

}

cq.add();

   }

this.jeecgDemoService.getDataGridReturn(cq, true);

TagUtil.datagrid(response, dataGrid);

}



在控制器中用request接收传递到后台的查询条件,或者直接在方法参数列表里填上,springmvc会帮我们获得。

然后将得到的范围查询条件添加到CriteriaQuery对象中,最后调用CriteriaQuery的add()方法加载生成hql。

至此,范围查询就完成了。

1.3.3. 查询字段添加日期控件

例如,要给创建日期的范围查询条件框添加日期控件,首先为创建日期添加范围查询:


<t:dgCol title="创建日期" field="createTime" formatter="yyyy-MM-dd hh:mm:ss" query="true" queryMode="group"></t:dgCol>


用jquery为生成的createTime_start和createTime_end两个输入框添加日期控件。


$(document).ready(function(){

$("input").attr("class","easyui-datebox");

$("input").attr("class","easyui-datebox");

);


最终的效果如图56所示。

http://img.blog.csdn.net/20140514203913906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
1.3.4. 日期字段的数据格式化


在dategrid中,对于日期字段,可以通过设置<d:dgCol>的formatter属性配置格式化方式,实现对日期数据的格式化,如:


<t:dgCol title="创建日期" field="createTime" formatter="yyyy-MM-dd hh:mm:ss"

query="true" queryMode="group"></t:dgCol>


对于日期的格式化方式,可以参考JDK参考手册中SimpleDateFormat中对于日期和时间模式的说明,如图57所示。

http://img.blog.csdn.net/20140514204019093?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
1.3.5. 数据列表合计功能


进行数据的列表展示时,为数据显示合计数是一个很有用的功能,在jeecg 的datagrid中实现该功能的效果如图58所示。

http://img.blog.csdn.net/20140514204157734?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast
该功能的实现,主要是通过在加载datagrid的数据时,统计出所需的合计值,并放在datagrid对象的footer中。示例代码如下:


1@RequestMapping(params = "datagrid")

2publicvoid datagrid(JeecgDemo jeecgDemo,HttpServletRequest request, HttpServletResponse response, DataGrid dataGrid) {

3          CriteriaQuery cq = new CriteriaQuery(JeecgDemo.class, dataGrid);

4//查询条件组装器

5          org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil.installHql(cq, jeecgDemo);

6          String ctBegin = request.getParameter("createTime_begin");

7          String ctEnd = request.getParameter("createTime_end");

8if(StringUtil.isNotEmpty(ctBegin)&& StringUtil.isNotEmpty(ctEnd)){

9try {

10                  cq.ge("createTime", new SimpleDateFormat("yyyy-MM-dd").parse(ctBegin));

11                  cq.le("createTime", new SimpleDateFormat("yyyy-MM-dd").parse(ctEnd));

12            } catch (ParseException e) {

13                  e.printStackTrace();

14            }

15            cq.add();

16          }

17this.jeecgDemoService.getDataGridReturn(cq, true);

18//update-begin--Author:zhaojunfuDate:20130520 for:TASK #109 datagrid标签没有封装合计功能

19          String total_salary = String.valueOf(jeecgDemoService.findOneForJdbc("select sum(salary) as ssum from jeecg_demo").get("ssum"));

20/*

21* 说明:格式为 字段名:值(可选,不写该值时为分页数据的合计) 多个合计 以 , 分割

22         */

23   dataGrid.setFooter("salary:"+total_salary+",age,email:合计");

24//update-end--Author:zhaojunfuDate:20130520 for:TASK #109 datagrid标签没有封装合计功能

25          TagUtil.datagrid(response, dataGrid);

26      }



在该示例代码中,需要重点注意的是这里的第23行:


dataGrid.setFooter("salary:"+total_salary+",age,email:合计");


setFooter()方法接收一个字符串,其格式为s:字段名[:值],其中值为选填项,填了则使用给定的值,没填则自动统计分页合计,示例:


salary:35.00,age,email:合计


这里将salary的合计值通过查询数据库得出,而age则通过当前分页数据自动合计,email给定一个值“合计”,其作用是在datagrid对应于email列的下方显示一个说明信息。

页: [1]
查看完整版本: 开发指南专题七:JEECG微云快速开发平台查询HQL过滤器