2012-08-17 48 views
0

我正在使用JPA命名查询来加载加载延迟加载的数据表。并设置如下所示的第一和最大结果。分页不能用于首次加载的延迟加载数据表

Query query = entityManager.createNamedQuery("StudyplanCategory.findByStatusAndLimit"); 
int end=(start*pageNumber); 
query.setParameter("status", status); 
query.setParameter("start", start); 
query.setParameter("end", end); 
query.setMaxResults(end - start); 

负载方法如下:

public List<StudyplanCategory> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) { 
       List<StudyplanCategory> data = new ArrayList<StudyplanCategory>(); 
       //System.out.println("Page First Value:"+first+"PageSize Value:"+pageSize); 
       datasource=categoryService.findDynaEditStudyPlan("NOT_USER_SPECIFIC",first,pageSize); 
       //filter 
       for(StudyplanCategory studyplanCategory : datasource) { 
        boolean match = true; 
        for(Iterator<String> it = filters.keySet().iterator(); it.hasNext();) { 
         try { 
          String filterProperty = it.next(); 
          String filterValue = filters.get(filterProperty).toLowerCase(); 
          String fieldValue = String.valueOf(studyplanCategory.getClass().getDeclaredField(filterProperty).get(studyplanCategory)).toLowerCase(); 
          //System.out.println("fieldValue............."+fieldValue); 
          if(filterValue == null || fieldValue.startsWith(filterValue)) { 
           match = true; 
          } 
          else { 
           match = false; 
           break; 
          } 
         } catch(Exception e) { 
          match = false; 
          System.out.println("The Exception occured at"+e); 
         } 
        } 

        if(match) { 
         data.add(studyplanCategory); 
        } 
       } 

       //sort 
       if(sortField != null) { 
        Collections.sort(data, new LazySorter(sortField, sortOrder)); 
       } 

       //rowCount 
       int dataSize = data.size(); 
       this.setRowCount(dataSize); 

       //paginate 
       if(dataSize > pageSize) { 
        try { 
         return data.subList(first, first + pageSize); 
        } 
        catch(IndexOutOfBoundsException e) { 
         return data.subList(first, first + (dataSize % pageSize)); 
        } 
       } 
       else { 
        return data; 
       } 
      } 

但是,当加载表下一步按钮处于非活动状态,因为我只加载加载第一页所需的这些数据。我该如何解决这个问题。

+0

你是否实现了'LazyDataModel'? – flash 2012-08-17 12:42:16

+0

你在这里发布的代码片段不是你以前的问题中的答案的代码.. http://stackoverflow.com/questions/11650361/how-to-set-parameters-for-a-named-query/ 11650604#comment16014141_11650604此外,您还没有包括实际与此问题相关的代码:您调用jpa查询(并可能覆盖LazyDataModel方法)的托管bean代码 – Damian 2012-08-17 13:09:03

回答

1

您需要激发另一个设置总行数的查询。基本上,在​​:

public List<StudyplanCategory> load(...) { 
    setRowCount(studyplanCategoryService.count()); 
    return studyplanCategoryService.list(...); 
} 

无关的具体问题,您应该实际使用Query#setFirstResult()设置第一个记录索引。

+0

谢谢发布了有关使用计数或计数(* )在JPA QL.Please检查。 – 2012-08-18 08:52:27