1. 背景

对于用户来讲查询功能按易用性分三个层次:

1)最简单查询操作是一个输入框,全文检索,如百度,后台实现技术使用搜索引擎,需要设计和建立索引,技术较为复杂,适用于文档和信息数据库检索,但是结果很难精确控制。

2)其次是定义字段查询,很多企业信息系统大多用的是这种查询,针对模块特定字段的查询,有针对性、使用门坎低,适用于企业内部信息管理系统模块定制。

3)最后一种是专门针对数据模型灵活的查询编辑器,使用难度最高,但是查询结果可以灵活和精确的控制,适用于有一定IT知识并对数据相当了解的用户,同时又可以避免直接将数据库暴露给用户带来的不安全隐患。

大家不难发现一个好的系统软件的查询基本会涵盖上述三种类型的查询功能

2. jeecg实现原理

Jeecg系统中模块主要使用第二种方式的查询功能,使用hibernate的QBC来封装前端查询条件,针对字段的定制过滤条件,最后转换为sql执行数据库查询。

现有方案优点:

  • 默认无须复杂开发即可实现字段检索,支持范围、模糊、精确匹配查询
  • 内置简单表达式支持:!*,实现非、模糊、数组等

    现有方案缺点:

  • 不支持or条件
  • 不支持字段间操作field1=field2
  • 不支持非hibernate关联表联合查询
  • 单一字段条件只能出现一次
  • 不支持sql嵌套
  • 要支持上述功能需要额外开发定制工作

某些特定场景下,用户想要通过模块获得相关信息必须借助于第三方报表模块功能或求助于开发人员,无形中对报表模块开发带来一定压力。比如,用户要从模块中查询特殊的部分数据进行操作,现有查询功能无法做到,报表模块又不能操作编辑,这个时候就是高级查询器定制查询功能派上用场的时候了。

3. 类似应用举例

我们来看看Outlook邮件查询设计:

1)全文检索型

2)字段定制型

3)高级查找

微软Team Foundation Server查询编辑器:

4. Jeecg查询器设计与实现

    UI设计:首先要实现高级查询,必须要对数据表元信息metadata进行封装才可以通用化,我们利用datagrid标签中的columnList来自动生成字段下拉列表。作为高级查询,从易用的性和使用频率的角度功能所占UI比例不能太多,采用弹出窗口实现,如图:

这里的表格我使用了treegrid,因为更适合表达sql语法树,但没有实现树形结构,条件只加了大于、小于、包含等常用操作符,有待后续扩展sql嵌套。

右侧有查询历史,将每次查询的json条件保存在一个数组中实现快速重查,这个历史查询记录使用HTML5的localstorage保存在客户端缓存中,下次登录仍然有效,对于不支持localstorage的浏览器将使用cookie存储。

    前后端交互:从到向前兼容性和对框架升级改动最小的因素考虑,将查询器组装的所有内容封装到一个json字符串,作为一个参数_sqlbuidler传递到后台,由后台控制条件组装,更加安全,防止sql注入等漏洞

json格式示例:

[{“id”:101,”field”:”user_name”,”condition”:”like”,”value”:”%王%”,”relation”:”and”},{“id”:101,”field”:”user_name”,”condition”:”like”,”value”:”%王%”,”relation”:”and”}]

后台封装处理java对象QueryCondition

package org.jeecgframework.web.demo.entity.test;
import java.util.List;
public class QueryCondition {String field;String type;String condition;String value;String relation;List<QueryCondition> children;public List<QueryCondition> getChildren() {return children;}public void setChildren(List<QueryCondition> children) {this.children = children;}public String getField() {return field;}public void setField(String field) {this.field = field;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getCondition() {return condition;}public void setCondition(String condition) {this.condition = condition;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public String getRelation() {return relation;}public void setRelation(String relation) {this.relation = relation;}public String toString(){StringBuffer sb =new StringBuffer();sb.append(this.relation).append(" ");sb.append(this.field).append(" ").append(this.condition).append(" ");if("java.util.Date".equals(this.type)){sb.append("to_date('").append(this.value).append("','yyyy-MM-dd')");}else if("java.lang.Number".equals(this.type)||this.condition.indexOf("in")>0){//TODO 需要按类型处理sb.append(this.value);}else{sb.append("'").append(this.value).append("'");//TODO 需要处理特殊字符}return sb.toString();}
}

后台解析处理代码,修改org.jeecgframework.core.extend.hqlsearch.HqlGenerateUtil:

public static void installHql(CriteriaQuery cq, Object searchObj,Map<String, String[]> parameterMap) {installHqlJoinAlias(cq, searchObj, getRuleMap(), parameterMap, "");
//      --增加一个特殊sql参数处理---------------------------------- try{          if(StringUtil.isNotEmpty(parameterMap.get("_sqlbuilder"))){List<QueryCondition> list  = JSONHelper.toList(parameterMap.get("_sqlbuilder")[0], QueryCondition.class);String sql=getSql(list,"");System.out.println("DEBUG sqlbuilder:"+sql);cq.add(Restrictions.sqlRestriction(sql));}}catch(Exception e){e.printStackTrace();}
//      --增加一个特殊sql参数处理---------------------------------- cq.add();}

5. 实现约束

  • 只支持标准命名的表名,因为是通过java驼峰命名转换带下划线的数据库表名,如果表名不是这个规则字段名会转换错误;
  • Sql前端界面在输入时并没有做太多约束和控制,因此非专业用户使用时会出现非法的语句而查询无果,建议在懂sql的人员指导下使用不要直接交给用户。

6. 标签使用

Datagrid标签中已经对高级查询器做了封装,js变量也根据每个模块的id做了命名处理防止冲突。

使用时只需在datagrid标签加一个属性queryBuilder="true",例如

<t:datagrid name="jeecgDemoList" title="DEMO示例列表" autoLoadData="true" actionUrl="jeecgDemoController.do?datagrid" sortName="userName" fitColumns="true"idField="id" fit="true" queryMode="group" checkbox="true" queryBuilder="true">

模块UI效果如下,重置后面会多一个按钮:

7. TODO

UI方面:易用性还可以提升,比如选中某字段和条件=时,值自动根据数据库表中该列实际值枚举一部分候选项;字段为date类型时,值编辑框变成date控件;字段为整形时,值编辑框有校验或只能输入整数的spinbox来防呆

功能:List<QueryCondition>对象转换为sql getSql()函数中仅仅实现拼装原生sql,这块还有很大的改进空间,可以增加字段类型(int,string,date)的识别和处理、操作符(正则匹配)、内置表达式和函数(类似TFS)等扩展。

安全:模块按钮还没有跟权限绑定,只是通过标签属性来开关,应该加一个动态权限由系统配置来控制

【JEECG技术文档】Jeecg高级查询器相关推荐

  1. 【JEECG技术文档】JEECG高级查询构造器使用说明

    功能介绍   高级查询构造器支持主子表联合查询,查询出更精确的数据. 要使用高级查询构造器需要完成以下步骤: 1. 在高级查询管理配置主子表信息. 2. 配置完后在JSP页面DataGrid标签上添加 ...

  2. 【JEECG技术文档】JEECG 接口权限开发及配置使用说明

    1.功能介绍 通过接口配置实现,对接口的访问权限控制和数据权限控制,接口时REST接口,接口权限认证机制使用Json web token (JWT) 接口权限调用流程: (1)通过接口用户的用户名密码 ...

  3. MongoDB 文档的高级查询操作

    第1关:数据的导入导出 本关任务:向数据库导入数据和从数据库导出数据. 第2关:高级查询(一) 本关任务:根据编程要求完成文档查询. 第3关:高级查询(二) 本关任务:根据编程要求完成文档查询. 第4 ...

  4. educoder MongoDB 文档的高级查询操作

    第1关:数据的导入导出 mongoimport -d mydb1 -c test --type csv --headerline --ignoreBlanks --file /home/example ...

  5. 【JEECG技术文档】JEECG平台对外接口JWT应用文档V3.7.2

    一. 接口方式 接口调用采用http协议,rest请求方式: 二. 接口安全 接口安全采用Json web token (JWT)机制,基于token的鉴权机制. 1. 机制说明 基于token的鉴权 ...

  6. 【JEECG技术文档】Redis与Eache切换文档

    前言: JEECG默认缓存采用的是Eache,如何切换Redis,jeecg已经提供方案如下,主要修改两方面内容,第一个是AOP拦截器,第二个是缓存工具类,具体参考如下: 一.切换AOP拦截器 1.注 ...

  7. 【JEECG技术文档】JEECG在线聊天插件功能集成文档

    原文地址:http://jeecg.iteye.com/blog/2320670 JEECG在线聊天插件功能集成文档 前提: 采用jeecg_3.6.3版本以上(Maven工程) 插件项目: 在线聊天 ...

  8. 【JEECG技术文档】JEECG online 表单填值规则使用说明

    1. 功能介绍 JEECG online规则值自动生成功能 为实现online表单数据初始化功能. 为实现图中红框字段初始化功能,需要完成下面4步操作: 1)编写规则实现类 2) 配置填值规则 3)o ...

  9. 【JEECG技术文档】表单配置-树形表单

    表单配置支持树型表单了,具体效果如下图: 配置说明: 1.是否树:选择是. 2.树形表单父Id:表的自关联外键. 3.树形表单列表:显示树形图标的列,如上图中为[组织机构名称]. 4.默认值:最外层数 ...

最新文章

  1. java中什么是空指针异常_java中空指针异常的问题,是怎么回事?请看代码
  2. 干货丨从线性回归到无监督学习,数据科学家需要掌握的十大统计技术
  3. 关于Android加载的优化
  4. LeetCode Third Maximum Number
  5. 程序员面试题精选100题(43)-n个骰子的点数[算法]
  6. oracle 日期排序_日期居然用字符串保存?我笑了
  7. 处理WinForm多线程程序时的陷阱(摘自网络)
  8. 定西市计算机考试,2019年3月甘肃省定西市计算机等级考试时间
  9. UVA - 400 Unix ls
  10. 版本控制工具历史的10个里程碑
  11. Spring AOP技术(基于AspectJ)的XML开发
  12. [Ajax] Ajax的基本用法
  13. MySQL内连接和外连接
  14. iOS 开发常用链接总结
  15. android 手机设备刷新dns
  16. NVIDIA NGC镜像使用笔记
  17. 弘辽科技:淘宝商品入池怎么设置?技巧有哪些?
  18. 计算机管理为什么不能扩展卷,Win10 C盘不能扩展卷怎么解决?
  19. “梧桐杯”中国移动大数据应用创新大赛 - 智慧金融赛道Baseline
  20. 皮卡智能联手全球最大贸易服务商PingPong,共推AIGC应用落地服务

热门文章

  1. HTML学习之四CSS盒子
  2. python plt legend并排_matplotlib如何控制legend的位置之二
  3. Unity 3D 游戏脚本 多脚本管理
  4. 人生不是故事,人生是世故,摸爬滚打才不会辜负功名尘土
  5. 戏说计算机发展史,戏说计算机与哲学
  6. cmwap和cmnet接入点的区别
  7. 解决Ubuntu 16.04 的应用商店卸载或加载不出来的教程
  8. leetcode-377:组合总和 Ⅳ
  9. 安装配置webpack webpack不是内部或外部命令
  10. vue实现列表的无缝滚动