我有一个包含5000多个数据记录的网格。这些数据每天都在增长。当我用网格加载页面时,网格显示数据几乎要花一分钟,我必须一次显示10行。
然后可以使用此jqGrid实现延迟加载吗?
这是我生成JSon字符串的操作:
@RequestMapping(value = "studentjsondata", method = RequestMethod.GET) public @ResponseBody String studentjsondata(HttpServletRequest httpServletRequest) { Format formatter = new SimpleDateFormat("MMMM dd, yyyy"); String column = "id"; if(httpServletRequest.getParameter("sidx") != null){ column = httpServletRequest.getParameter("sidx"); } String orderType = "DESC"; if(httpServletRequest.getParameter("sord") != null){ orderType = httpServletRequest.getParameter("sord").toUpperCase(); } int page = 1; if(Integer.parseInt(httpServletRequest.getParameter("page")) >= 1){ page = Integer.parseInt(httpServletRequest.getParameter("page")); } int limitAmount = 10; int limitStart = limitAmount*page - limitAmount; List<Student> students = Student.findAllStudentsOrderByColumn(column,orderType,limitStart,limitAmount).getResultList(); List<Student> countStudents = Student.findAllStudents(); double tally = Math.ceil(countStudents.size()/10.0d); int totalPages = (int)tally; int records = countStudents.size(); StringBuilder sb = new StringBuilder(); sb.append("{\"page\":\"").append(page).append("\", \"records\":\"").append(records).append("\", \"total\":\"").append(totalPages).append("\", \"rows\":["); boolean first = true; for (Student s: students) { sb.append(first ? "" : ","); if (first) { first = false; } sb.append(String.format("{\"id\":\"%s\", \"cell\":[\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\"]}",s.getId(), s.getId(), s.getFirstName(), s.getLastName(), formatter.format(s.getDateOfBirth().getTime()), s.getGender(), s.getMaritalStatus())); } sb.append("]}"); return sb.toString(); }
这是带有jqGrid的页面:
$("#studentGrid").jqGrid({ url: '/starburst/programmes/studentjsondata', datatype: 'json', height: 'auto', colNames:['id','First Name', 'Last Name', 'Date Of Birth', 'Gender', 'Marital Status'], colModel:[ {name:'id',index:'id', width:15}, {name:'firstName',index:'firstName', width:30, formoptions:{elmprefix:'(*) '}, editable:true, edittype: 'text', editrules:{required:true}}, {name:'lastName',index:'lastName', width:30, formoptions:{elmprefix:'(*) '}, editable:true, edittype: 'text',editrules:{required:true}}, {name:'dateOfBirth',index:'dateOfBirth', width:30, formoptions:{elmprefix:'(*) '},editrules:{required:true}, editable:true, edittype: 'text', editoptions: { dataInit: function(element) { $(element).datepicker({dateFormat: 'MM dd, yy'}) } } }, {name:'gender',index:'gender', width:30, formoptions:{elmprefix:'(*) '}, editable:true, editrules:{required:true}, edittype: 'select', editoptions:{value:{}} }, {name:'maritalStatus',index:'maritalStatus', width:30, formoptions:{elmprefix:'(*) '}, editable:true, editrules:{required:true}, edittype: 'select', editoptions:{value:{}} } ], rowNum:10, autowidth: true, pager: '#pager', sortname: 'id', viewrecords: true, sortorder: "desc", caption:"Students", emptyrecords: "Empty Records", subGrid: true, /* <![CDATA[ */ onSelectRow: function(id){ if((lastsel != 0)&&(id!==lastsel)){ $("#studentGrid").jqGrid('collapseSubGridRow', lastsel); } lastsel=id; }/* ]]> */ }); $("#studentGrid").jqGrid('navGrid', "#pager", {edit:false,add:false,del:false,search:true},{ },{ },{ }, { sopt:['eq', 'ne', 'lt', 'gt', 'cn', 'bw', 'ew'], closeOnEscape: true, multipleSearch: true,
请参阅下面的查询:
public static TypedQuery<tt.edu.sbcs.model.Student> findAllStudentsOrderByColumn(String column, String orderType, int limitStart, int limitAmount) { EntityManager em = Programme.entityManager(); TypedQuery<Student> q = em.createQuery("SELECT o FROM Student AS o ORDER BY"+" "+column+" "+orderType, Student.class); q.setFirstResult(limitStart);//used to skip the first "N" elements form the result set, it indexes results form zero q.setMaxResults(limitAmount); return q; }
我在上述操作中设置的限制金额。该值为10。
好的,所以这是一个基于JPA的部分答案(但是我想让它适应Hibernate应该几乎是微不足道的)。您应该能够执行以下操作以仅获取必要的对象:
Query query = em.createQuery("select o from " + "Student"+ " as o order by o.id"); query.setFirstResult(start); query.setMaxResults(end - start); return query.getResultList();
为了计数,应该执行以下操作:
Number count = (Number) em.createQuery("select count(id) from " + "Student").getSingleResult(); if (count == null) { count = Integer.valueOf(0); } return count.intValue();
当我有更多信息时将进行编辑。