public ModelAndView query(HttpServletRequest request, HttpServletResponse response) {
    ModelAndView mv = new ModelAndView();
    int curPage = ServletRequestUtils.getIntParameter(request, "curPage", 0);

    int pageSize = ServletRequestUtils.getIntParameter(request, "pageSize", 100);

    if (pageSize > 10000) {
      throw new RuntimeException("max pageSize can not be more than 10000");
    }

    PageBean pageBean = null;
    if (curPage != 0) {
      pageBean = new PageBean(curPage, pageSize);
    }

    String errorMsg = "";

    final SearchParam searchParam = new SearchParam();
    try {
      request.setCharacterEncoding("utf-8");
      String tableName = request.getParameter("table");

      String select = request.getParameter("select");
      String where = request.getParameter("where");
      String keys = request.getParameter("keys");
      String startKey = request.getParameter("startKey");
      String endKey = request.getParameter("endKey");
      String family = request.getParameter("family");
      String hbaseFilter = request.getParameter("hbaseFilter");

      if (startKey == null) startKey = "";

      if (endKey == null) endKey = "";

      String tenantId = request.getParameter("tenantId");

      if (startKey != null && startKey.contains("$")) {
        if (tenantId != null) {
          String[] tenantIdArray = tenantId.split(",");
          startKey = startKey.replaceFirst(REGEX, tenantIdArray[0]);
        }
      }

      if (endKey != null && endKey.contains("$")) {
        if (tenantId != null) {
          String[] tenantIdArray = tenantId.split(",");
          endKey = endKey.replaceFirst(REGEX, tenantIdArray[0]) + "_z";
        }
      }

      searchParam.setTableName(tableName);
      searchParam.setFamily(family);
      searchParam.setStartKey(startKey);
      searchParam.setEndKey(endKey);
      searchParam.setKeys(keys);
      searchParam.setWhere(where);
      searchParam.setHbaseFilter(hbaseFilter);
      searchParam.setSelect(select);

    } catch (Exception e) {
      logger.error(e.getMessage(), e);
      errorMsg += e.getMessage();
    }

    try {
      pageBean = getDataMapTemp(searchParam, curPage, pageSize);
    } catch (IOException e) {
      errorMsg += e.getMessage();
    }

    @SuppressWarnings("unchecked")
    List<Map<String, String>> rows = pageBean.getResults();

    List<String> titleList = new ArrayList<String>();
    if (null != rows && rows.size() > 0) {
      for (Iterator<String> iter = rows.get(0).keySet().iterator(); iter.hasNext(); ) {
        String next = iter.next();
        if ("_id".equals(next)) {
          titleList.add(0, next);
        } else {
          titleList.add(next);
        }
      }
    }

    DataSource dataSource = new DataSource();
    dataSource.setRows(pageBean.getResults());
    dataSource.setPage(pageBean.getCurrentPage());
    dataSource.setTotal(pageBean.getTotalRecords());
    dataSource.setRecords(pageBean.getLength());
    dataSource.setStatus("success");

    mv.addObject("status", errorMsg);
    mv.addObject("rows", rows);
    mv.addObject("keyList", titleList);
    mv.addObject("result", dataSource);

    return mv;
  }