查询过滤器 === **目录索引:** - 功能描述 - 查询条件如何实现 - 查询过滤器高级特性 1. 组合条件查询 2. 字段范围查询 3. 日期字段的数据格式化 - 查询规则 # 查询过滤器 ## 一、功能描述 查询过滤器可以帮助快速生成查询条件,不需要编码通过配置实现,支持模糊查询、匹配查询、范围查询、不匹配查询等规则。 ## 二、查询条件如何实现 **第一步:页面采用UI标签实现** 对需要实现查询的字段,增加属性 query="true",页面自动生成查询框,如下图所示。 ![](https://img.kancloud.cn/c4/62/c462613a200c08aae4b6cd05a5ed4279_902x254.png) 配置后页面效果如下(查询条件自动生成): ![](https://img.kancloud.cn/6f/6d/6f6d30e98032386d249fc5779f48d9a4_1385x362.png) **第二步:controller层处理** Controller中对应的处理逻辑中追加如下代码: ``` CriteriaQuery cq = new CriteriaQuery(TSUser.class, dataGrid); //查询条件组装器 HqlGenerateUtil.installHql(cq, user); ``` ## 三、查询过滤器高级特性 datagrid中的查询过滤器默认是单条件查询,即在设置多个dgCol的query=”true”之后,查询条件中同时只能有一个条件被使用,生成的页面效果如图7-3所示。 ![](https://img.kancloud.cn/24/08/2408066b68b9c1aea8c57b479c49e397_231x216.png) 图7-3默认查询过滤器效果 当然,可以通过datagrid和dgCol的参数设置来达到更高级的查询过滤功能,如组合查询条件和值范围查询。 ### 1.组合条件查询 设置<t:datagrid>标签的queryMode=”group”(参数默认为”single”,即单条件查询),在页面生成时,会生成一个组合查询条件输入面板。生成的页面效果如图7-4所示。 ![](https://img.kancloud.cn/fd/47/fd4734dc5809093c56b65509c0c48067_555x84.png) 图7-4组合查询过滤器效果 ### 2.字段范围查询 设置<t:dgCol>标签的queryMode=”group”,在页面生成时,会生成一个范围输入框。生成的页面效果如图7-5所示。 ![](https://img.kancloud.cn/28/be/28bed4bf9275eabfb0e4c41df6c3f816_274x38.png) 图7-5字段范围查询效果 字段范围查询会为该字段生成两个输入框,name分别为“字段名_begin”和“字段名_end”,具体的查询逻辑查询过滤器自已经动组装实现,不需要再编码。 ### 3.日期字段的数据格式化 在datagrid中,对于日期字段,可以通过设置<d:dgCol>的formatter属性配置格式化方式,实现对日期数据的格式化,如: ``` <t:dgCol title="创建日期" field="createTime" formatter="yyyy-MM-dd hh:mm:ss" query="true" queryMode="group"></t:dgCol> ``` 对于日期的格式化常用表达式:yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd ## 四、查询规则 **说明:**页面查询字段,需跟后台Action(或Controller)中Page的字段对应一致,后台不需写代码自动生成HQL查询条件; 默认查询条件是全匹配,想实现模糊查询需求在查询值的前后加: \*; **查询匹配方式规则:** [1].全匹配查询:查询数据没有特殊格式,默认为全匹配查询 [2].模糊查询:查询数据格式需加星号:{ \* } 例如: ``` 格式一: 张* (后模糊匹配) 格式二: *张 (前模糊匹配) 格式三: *张* (全模糊匹配) 格式四: *张*三* (更高级匹配) ``` [3].包含查询:查询数据格式采用逗号分隔:{ , } 例如: ``` 格式: 张三,李四 (含义:In('张三','李四')) ``` [4].不匹配查询:查询数据格式需要加叹号前缀:{ ! } 例如: ``` 格式: !张三 (含义:不等于'张三') 特殊说明:查询不为Null的语法:!null(大小写没关系); 查询不为空字符串的方法:!(只有一个叹号); ``` [5].范围查询,支持数字,时间的范围查询,针对范围查询页面会生成两个查询控件 ``` 1. 如果是单一匹配方式,则页面查询控件的name, 跟实体字段命名一样 2. 如果是范围匹配方式,则页面查询控件需要变成两个分别名 {*}_begin,{*}_end {*}_begin: 表示查询范围开始值 {*}_end: 表示查询范围结束值 举例: 字段名称 orderDate 查询开始时间 : orderDate_begin 查询结束时间 : orderDate_end ```