jqGrid的單字段查詢

首先說明一下,什麼是jqGrid的單字段查詢。就是隻能經過一個字段做爲查詢條件的查詢。雖然大多數狀況下,系統功能須要的查詢,都是多個字段組合查詢的,jqGrid也提供組合多個字段的查詢,可是組合多個字段的查詢,其實基於的原理仍是單字段的查詢。因此這裏主要介紹一下單字段的查詢,之後有機會在來講明一下高級一點的多字段組合查詢。數據庫

你們能夠先看看圖片,對單字段查詢有一個直觀的瞭解(圖片來源於jqGrid的wiki)json

這裏須要注意的幾點分別說明以下:服務器

首先,其實默認jqGrid就有這個功能,因此,向上一篇文章中的例子同樣,基本上不須要在js中添加其餘的代碼。app

其次,哪些字段能做爲單字段查詢,哪些字段不能,這是在jqGrid的colModel屬性中能夠進行設置的。好比,若是咱們對某一個列的數據設置以下:{name:'userName',index:'usrName', width:110,search=false} 那麼這個userName列是不會在單字段查詢中顯示出來的。less

第三,點擊上面圖中的"Find"按鈕以後,jqGrid會額外的向服務器發送幾個參數過去。想必你已經猜到了,這些參數就是圖片中顯示的:查詢字段searchField,查詢操做searchOper以及查詢值searchString。這裏之因此說是額外的參數,是相對於默認狀況下的參數,好比前一篇文章中所說的page,sidx,sord,rows,_search,nd這些參數而言的。固然,這裏_search參數的值是true。ui

第四,最煩處理的,就是如何把咱們的searchOper的參數值,轉換爲對數據庫記錄的查詢操做。this

頁面上顯示的操做,主要包括'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'。spa

最最簡單的想法就是像我這養,寫一個方法來處理:(如下的例子是基於Hibernate寫的)code

/**
	 * 根據參數獲取查詢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,好比對空值的處理不夠完善;二是對日期類型的處理功能基本上沒有等等。呵呵,暫時先這樣吧!有興趣你們也能夠幫忙修改一下!

相關文章
相關標籤/搜索