为什么80%的码农都做不了架构师?>>>   

首先说明一下,什么是jqGrid的单字段查询。就是只能通过一个字段作为查询条件的查询。虽然大多数情况下,系统功能需要的查询,都是多个字段组合查询的,jqGrid也提供组合多个字段的查询,但是组合多个字段的查询,其实基于的原理还是单字段的查询。所以这里主要介绍一下单字段的查询,以后有机会在来说明一下高级一点的多字段组合查询。

大家可以先看看图片,对单字段查询有一个直观的了解(图片来源于jqGrid的wiki)

这里需要注意的几点分别说明如下:

首先,其实默认jqGrid就有这个功能,所以,向上一篇文章中的例子一样,基本上不需要在js中添加其他的代码。

其次,哪些字段能作为单字段查询,哪些字段不能,这是在jqGrid的colModel属性中可以进行设置的。比如,如果我们对某一个列的数据设置如下:{name:'userName',index:'usrName', width:110,search=false} 那么这个userName列是不会在单字段查询中显示出来的。

第三,点击上面图中的"Find"按钮之后,jqGrid会额外的向服务器发送几个参数过去。想必你已经猜到了,这些参数就是图片中显示的:查询字段searchField,查询操作searchOper以及查询值searchString。这里之所以说是额外的参数,是相对于默认情况下的参数,比如前一篇文章中所说的page,sidx,sord,rows,_search,nd这些参数而言的。当然,这里_search参数的值是true。

第四,最烦处理的,就是如何把我们的searchOper的参数值,转换为对数据库记录的查询操作。

页面上显示的操作,主要包括'equal', 'not equal', 'less', 'less or equal','greater','greater or equal', 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain'。相应的,后台获取到的searchOper的值,对应的是'eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'。

最最简单的想法就是像我这养,写一个方法来处理:(以下的例子是基于Hibernate写的)

/*** 根据参数获取查询HQL的语句(如果是日期字段可能会出问题)* @param sField 字段名称* @param sOper  操作名称* @param sValue 值* @return*/public static String getOperation(String sField, String sOper,String sValue){if(sValue==null || sValue.trim().length() ==0)return "";String result = "";if(sOper.trim().equals("eq"))    //等于result = sField + "='" + sValue +"' ";else if(sOper.trim().equals("ne"))  //不等于result = sField + " != '"+ sValue+"' ";else if(sOper.trim().equals("lt"))  //小于result = sField + " < '"+ sValue+"' ";else if(sOper.trim().equals("le")) //小于等于result = sField + " <= '"+ sValue+"' ";else if(sOper.trim().equals("gt")) //大于result = sField + " > '"+ sValue+"' ";else if(sOper.trim().equals("ge")) //大于等于result = sField + " >= '"+ sValue+"' ";else if(sOper.trim().equals("bw")) //以...开始result = sField + " LIKE '"+ sValue+"%' ";else if(sOper.trim().equals("bn"))    //不以...开始result = sField + " NOT LIKE '"+ sValue+"%' ";else if(sOper.trim().equals("in")){  //包括String[] sv = sValue.split(",");String svString = "";for(int i = 0 ;i

然后在dao类中,像如下这样进行查询和返回

@SuppressWarnings("unchecked")public PageModel findAll(int page, int rows, String sidx, String sord,String sField,String sValue,String sOper){     Session s = null;try{s = this.getSession();//根据查询条件封装HQL语句StringBuilder searchHQL  = new StringBuilder ("");if(sField != null && sOper != null){String cond = SearchOperationUtil.getOperation(sField, sOper, sValue);if(cond != null && cond.trim().length() != 0){searchHQL.append(" WHERE brand.");searchHQL.append(cond);}}//得到总记录数   String queryCountHql = "select count(*) from MProductBrand brand" + searchHQL.toString();             Query query = s.createQuery(queryCountHql);  int records = ((Long)query.uniqueResult()).intValue();int offset  =  (page-1) * rows;searchHQL.append(" order by ");searchHQL.append("brand.");searchHQL.append(sidx);searchHQL.append(" "+sord);List datas = s.createQuery("from MProductBrand brand" + searchHQL.toString()).setFirstResult(offset).setMaxResults(rows).list();   //得到结果集   PageModel pm = new PageModel();   int totalPage = records/rows;if(records % rows > 0)totalPage += 1;pm.setTotal(totalPage);pm.setDatas(datas);pm.setPage(page);pm.setRecords(records);return pm;   }finally{if(s!=null)s.close();}}

当然了,在Action类中,我们还需要单独设置几个属性字段,并同时生成其相应的Getter和Setter。

private String searchField;private String searchString;private String searchOper;......@SuppressWarnings("unchecked")public String queryAllBrand(){       try{if(page == null ) page= "1";if(sidx==null) sidx ="brandId";if(rows==null) rows ="30";if(sord==null) sord ="asc";if(_search == null) _search="";if(nd == null) nd = "0";log.info("Page="+page+";sidx="+sidx+";rows="+rows+";sord="+sord+";_search="+_search+";nd="+nd);log.info("searchField="+searchField+";searchValue="+searchString+";searchOper="+searchOper);PageModel pm = this.brandService.findAll(Integer.parseInt(page), Integer.parseInt(rows),sidx,sord,searchField,searchString,searchOper);//封装成JSON对象返回HttpServletResponse response = ServletActionContext.getResponse();response.setContentType("text/json; charset=UTF-8");PrintWriter out = response.getWriter();JSONObject obj = new JSONObject();obj.put("page", pm.getPage());obj.put("total",pm.getTotal());obj.put("records",pm.getRecords());JSONArray lineitemArray = new JSONArray();List data = pm.getDatas();Iterator it = data.iterator();while (it.hasNext()){MProductBrand mpb = (MProductBrand)it.next();lineitemArray.add(mpb.getJSON());}obj.put("rows", lineitemArray);out.print(obj.toString());}catch(Exception e){e.printStackTrace();}return null;}

看上面这个代码可能会有点糊涂,因为我们的Pojo对象中,还有一个重要的方法,把POJO转换为JSON对象。

//注意,JSON数据插入的顺序是和页面显示的顺序相关的。public JSONObject getJSON(){JSONObject json = new JSONObject();json.put("brandId", brandId);json.put("code", code);json.put("brandName", brandName);json.put("status", status);return json;}

感觉比较丑陋的,还是那个getOperation方法,一个是本身还有很多的bug,比如对空值的处理不够完善;二是对日期类型的处理功能基本上没有等等。呵呵,暂时先这样吧!有兴趣大家也可以帮忙修改一下!

转载于:https://my.oschina.net/yonge/blog/1906

jqGrid的单字段查询相关推荐

  1. oracle中的单表查询,单字段与多字段排序

    -单表的查询学习 –查询表的所有数据 select *from 表名; *代表所有 select *from emp; –查询表中指定字段的值 :select 字段名1,字段名2,-from表名 se ...

  2. Lucene进阶操作,单字段、多字段和布尔搜索

    上一篇文章是入门,现在是进阶,通过项目用到的例子给大家呈现较好的方法.本方法基于Lucene-4.7.2因为项目要用到JDK1.6. 这里使用几个很好用的类,是经过多次试验整理出来的,分别是单字段搜索 ...

  3. oracle 单表查重,Oracle如何用单字段或多字段进行查重

    最近在整理数据形成信用报告,发现重复的数据真的多,梳理都好久.我就做个笔记把去掉重复数据的方法整理下来.方便我后期查阅. 我将我目前已知的两种去重方法分为:视图去重和表去重.原理就是有无rowid这个 ...

  4. Oracle如何用单字段或多字段进行查重

    单字段查重 表A: ID name uscc money 1 张飞 11111 100 2 关羽 22222 100 3 刘备 33333 300 4 马超 44444 400 5 张飞 55555 ...

  5. php表单的输出,php – Joomla输入表单字段输出

    我想做的就是给joomla输入表单提供基本的bootstrap样式: some text 我使用带有less的mixin将样式应用于现有的输入类 //input form fields .valida ...

  6. react 统一字段验证_如何使用React的受控输入进行即时表单字段验证

    react 统一字段验证 by Gosha Arinich 通过Gosha Arinich 如何使用React的受控输入进行即时表单字段验证 (How to use React's controlle ...

  7. html表单文本框怎么输出函数值,如何获取用户输入的html文本表单字段传递给javascript函数的值?...

    我想通过生成用户必须输入到文本输入表单字段的随机数创建我自己的反垃圾邮件过滤器,如果它是正确的,他们进入下一页,如果不是,则显示错误数字输入不正确.如何获取用户输入的html文本表单字段传递给java ...

  8. adobe reader java_使用PDF框设置的表单字段值在Adobe Reader中不可见

    尝试使用Apache PDFBOX(1.8.5)从字段中设置一些问题我遇到了问题 . 我有几个不同的静态PDF用于测试 . 使用以下代码,我可以设置表单字段的值,并保存生成的PDF . 然后,我可以在 ...

  9. Java Stream Collectors.groupingBy()实现分组(单字段分组,多字段分组)

    1 User实体类 public class User {private Long userId;/*** 用户名(登录)*/private String username;/*** 年龄*/priv ...

最新文章

  1. 如何合理地估算线程池大小?
  2. 创业5年,我有5点关于人的思考
  3. 计算机科学与技术 天涯,计算机科学与技术专业
  4. 【MySQL】MySQL监控工具 mysql-monitor
  5. 路由器距离向量算法计算举例_文本去重算法:Minhash/Simhash/Klongsent
  6. 想起JDK1.4的死机事故
  7. 关于Oracle RAC基本概念
  8. CMU 15-213 Introduction to Computer Systems学习笔记(21) Synchronization: Basic
  9. 必须安装三星系列android系统智能手机usb驱动程序,三星安卓4.0怎么刷机 三星安卓4.0刷机教程...
  10. android 极光推送1011,极光推送 · OpenKit使用手册 · 看云
  11. linux安装pdf阅读器 | 安装删除有道词典
  12. opencv实现银行卡号识别
  13. 简单实用计划提醒便签软件 界面简洁功能一目了然
  14. 支持NDS的视频音频转换软件Xilisoft Video Converter
  15. 计算机桌面用什么实木板好,几百块打造属于你的专属实木(硬木)电脑桌
  16. 第二、三范式与BC范式的区别
  17. TM1638芯片的显存地址详细解读
  18. 用户之声 | GBASE南大通用实训有感
  19. 网站nginx配置限制单个IP访问频率,预防DDOS恶意攻击
  20. 关于分块矩阵和矩阵的秩的应用

热门文章

  1. 最短路dijkstra算法详解_图论系列开始填坑--Dijkstra,单源最短路
  2. 机器学习实战——KNN及部分函数注解
  3. CGAL中Point的引用
  4. 一天搞定DXUT三步曲之一:DXUT框架
  5. js函数提示 vscode_VSCode + JSDoc 完美实现(almost)JavaScript代码提示
  6. 2022最新PHP开发的二级域名分发系统源码 附安装教程
  7. SQL笔试之远交近攻
  8. C# 获得当前运行程序所在的目录的代码
  9. 如何使用STM32F4的BootLoader和APP程序
  10. UE4 中的人工智能解析—ShooterGame为例