开发指南专题七:JEECG微云快速开发平台查询HQL过滤器
開發(fā)指南專題七:JEECG微云快速開發(fā)平臺(tái) HQL過(guò)濾器
1.?查詢HQL過(guò)濾器
1.1.?數(shù)據(jù)過(guò)濾現(xiàn)狀分析
項(xiàng)目開發(fā)的查詢頁(yè)面都會(huì)有很多查詢條件,開發(fā)追加查詢條件的工作繁瑣又很浪費(fèi)時(shí)間。
這塊工作量主要在:頁(yè)面加查詢字段和后臺(tái)代碼邏輯判斷,追加查詢條件;
目前JAVA持久層主流框架Hibernate和Ibatis實(shí)現(xiàn)方式分析:
[1].Hibatente?技術(shù)實(shí)現(xiàn):
A.頁(yè)面追加查詢字段;?
B.后臺(tái)代碼需加邏輯判斷,判斷字段是否為空,手工拼SQL追加查詢條件;
[2].IBATIS?技術(shù)實(shí)現(xiàn):
A.頁(yè)面追加查詢字段;??
B.后臺(tái)不需寫代碼,但是需在XML文件中追加該字段非空判斷和查詢條件;
特點(diǎn):常規(guī)功能的頁(yè)面查詢方式只能是"全匹配"和"模糊查詢",對(duì)于特殊的?"包含查詢"和"不匹配查詢",??只能寫特殊邏輯代碼
1.2.??查詢條件SQL生成器
1.2.1.?實(shí)現(xiàn)原理
根據(jù)頁(yè)面?zhèn)鬟f到后臺(tái)的參數(shù),動(dòng)態(tài)判斷字段是否為空,自動(dòng)拼SQL追加查詢條件。
實(shí)現(xiàn)的功能:實(shí)現(xiàn)了"模糊查詢"?,?"包含查詢"?,?"不匹配查詢"?等SQL匹配功能。
特點(diǎn):頁(yè)面僅僅追加一個(gè)查詢字段,后臺(tái)不需要寫任何代碼,查詢功能自動(dòng)實(shí)現(xiàn)。
1.2.2.?查詢規(guī)則
要求:頁(yè)面查詢字段,需跟后臺(tái)Action(或Controller)中Page的字段對(duì)應(yīng)一致,后臺(tái)不需寫代碼自動(dòng)生成HQL,追加查詢條件;默認(rèn)生成的查詢條件是全匹配;
?查詢匹配方式分類:
[1].全匹配查詢:查詢數(shù)據(jù)沒(méi)有特殊格式,默認(rèn)為全匹配查詢
[2].模糊查詢:查詢數(shù)據(jù)格式需加星號(hào)[*]?????例如:{MD*/*MD*/*M*D*}
[3].包含查詢:查詢數(shù)據(jù)格式采用逗號(hào)分隔[,]??例如:?{01,03}(含義:in('01','03'))
[4].不匹配查詢:查詢數(shù)據(jù)格式需要加嘆號(hào)前綴[!]?例如:{!123}(含義:不等于123)
特殊說(shuō)明:查詢不為Null的方法=!null(大小寫沒(méi)關(guān)系);查詢不為空字符串的方法=!(只有一個(gè)嘆號(hào)).
[5].時(shí)間范圍范圍查詢
jsp?頁(yè)面中使用的name:需要查詢的日期類型字段名本身(什么都不加),表示查詢時(shí)查詢等于該字段時(shí)間的數(shù)據(jù)
begin:需要查詢的日期類型字段名(首字母大寫),表示查詢開始時(shí)間?查詢時(shí)查詢大于等于開始時(shí)間的數(shù)據(jù)
end:?需要查詢的日期類型字段名(首字母大寫),表示查詢結(jié)束時(shí)間查詢時(shí)查詢小于等于結(jié)束時(shí)間的數(shù)據(jù)?
使用舉例:
字段名稱?private?Date?birthday
查詢開始時(shí)間?beginBirthday
查詢結(jié)束時(shí)間?endBirthday
1.2.3.?具體實(shí)現(xiàn)
第一步:頁(yè)面實(shí)現(xiàn)
說(shuō)明:為dategrid字段,追加屬性?query="true",自動(dòng)加載出查詢框,如圖51所示。
第二步:controller層處理
Controller中對(duì)應(yīng)的處理邏輯如圖52所示。
1.3查詢過(guò)濾器高級(jí)特性
dategrid中的查詢過(guò)濾器默認(rèn)是單條件查詢,即在設(shè)置多個(gè)dgCol的query=”true”之后,查詢條件中同時(shí)只能有一個(gè)條件被使用,生成的頁(yè)面效果如圖53所示。
當(dāng)然,可以通過(guò)dategrid和dgCol的參數(shù)設(shè)置來(lái)達(dá)到更高級(jí)的查詢過(guò)濾功能,如組合查詢條件和值范圍查詢。1.3.1.?組合條件查詢
設(shè)置<t:dategrid>標(biāo)簽的queryMode=”group”(該參數(shù)值默認(rèn)為”single”,即單條件查詢),在頁(yè)面生成時(shí),會(huì)生成一個(gè)組合查詢條件輸入面板。生成的頁(yè)面效果如圖54所示。
1.3.2.?字段范圍查詢
設(shè)置<t:dgCol>標(biāo)簽的queryMode=”group”,在頁(yè)面生成時(shí),會(huì)生成一個(gè)范圍輸入框。生成的頁(yè)面效果如圖54所示。
? ? ? ?圖55字段范圍查詢效果
字段范圍查詢會(huì)為該字段生成兩個(gè)輸入框,name分別為“字段名_begin”和“字段名_end”,具體的查詢功能需要在后臺(tái)接收這兩個(gè)輸入框的內(nèi)容,并把查詢條件加入到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接收傳遞到后臺(tái)的查詢條件,或者直接在方法參數(shù)列表里填上,springmvc會(huì)幫我們獲得。
然后將得到的范圍查詢條件添加到CriteriaQuery對(duì)象中,最后調(diào)用CriteriaQuery的add()方法加載生成hql。
至此,范圍查詢就完成了。
1.3.3.?查詢字段添加日期控件
例如,要給創(chuàng)建日期的范圍查詢條件框添加日期控件,首先為創(chuàng)建日期添加范圍查詢:
| <t:dgCol?title="創(chuàng)建日期"?field="createTime"?formatter="yyyy-MM-dd?hh:mm:ss"?query="true"?queryMode="group"></t:dgCol> |
用jquery為生成的createTime_start和createTime_end兩個(gè)輸入框添加日期控件。
| $(document).ready(function(){?? $("input[name='createTime_begin']").attr("class","easyui-datebox");?? $("input[name='createTime_end']").attr("class","easyui-datebox");?? ); |
最終的效果如圖56所示。
1.3.4.?日期字段的數(shù)據(jù)格式化
在dategrid中,對(duì)于日期字段,可以通過(guò)設(shè)置<d:dgCol>的formatter屬性配置格式化方式,實(shí)現(xiàn)對(duì)日期數(shù)據(jù)的格式化,如:
| <t:dgCol?title="創(chuàng)建日期"?field="createTime"?formatter="yyyy-MM-dd?hh:mm:ss" ?query="true"?queryMode="group"></t:dgCol> |
對(duì)于日期的格式化方式,可以參考JDK參考手冊(cè)中SimpleDateFormat中對(duì)于日期和時(shí)間模式的說(shuō)明,如圖57所示。
1.3.5.?數(shù)據(jù)列表合計(jì)功能
進(jìn)行數(shù)據(jù)的列表展示時(shí),為數(shù)據(jù)顯示合計(jì)數(shù)是一個(gè)很有用的功能,在jeecg?的datagrid中實(shí)現(xiàn)該功能的效果如圖58所示。
該功能的實(shí)現(xiàn),主要是通過(guò)在加載datagrid的數(shù)據(jù)時(shí),統(tǒng)計(jì)出所需的合計(jì)值,并放在datagrid對(duì)象的footer中。示例代碼如下:
| 1 @RequestMapping(params?=?"datagrid")?? 2 publicvoid?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");?? 8 if(StringUtil.isNotEmpty(ctBegin)&&?StringUtil.isNotEmpty(ctEnd)){?? 9 try?{?? 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 ????????}?? 17 this.jeecgDemoService.getDataGridReturn(cq,?true);?? 18 //update-begin--Author:zhaojunfu??Date:20130520?for:TASK?#109?datagrid標(biāo)簽沒(méi)有封裝合計(jì)功能 19 ????????String?total_salary?=?String.valueOf(jeecgDemoService.findOneForJdbc("select?sum(salary)?as?ssum?from?jeecg_demo").get("ssum"));?? 20 /* 21 *?說(shuō)明:格式為?字段名:值(可選,不寫該值時(shí)為分頁(yè)數(shù)據(jù)的合計(jì))?多個(gè)合計(jì)?以?,?分割 22 ?????????*/ 23 ?dataGrid.setFooter("salary:"+total_salary+",age,email:合計(jì)"); 24 //update-end--Author:zhaojunfu??Date:20130520?for:TASK?#109?datagrid標(biāo)簽沒(méi)有封裝合計(jì)功能 25 ????????TagUtil.datagrid(response,?dataGrid);?? 26 ????}?? |
在該示例代碼中,需要重點(diǎn)注意的是這里的第23行:
| dataGrid.setFooter("salary:"+total_salary+",age,email:合計(jì)");? |
setFooter()方法接收一個(gè)字符串,其格式為s:字段名[:值],其中值為選填項(xiàng),填了則使用給定的值,沒(méi)填則自動(dòng)統(tǒng)計(jì)分頁(yè)合計(jì),示例:
| salary:35.00,age,email:合計(jì) |
這里將salary的合計(jì)值通過(guò)查詢數(shù)據(jù)庫(kù)得出,而age則通過(guò)當(dāng)前分頁(yè)數(shù)據(jù)自動(dòng)合計(jì),email給定一個(gè)值“合計(jì)”,其作用是在datagrid對(duì)應(yīng)于email列的下方顯示一個(gè)說(shuō)明信息。
?
?
總結(jié)
以上是生活随笔為你收集整理的开发指南专题七:JEECG微云快速开发平台查询HQL过滤器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [ZZ]最后一句话
- 下一篇: JEECG整合finereport快速搭