2012-08-17 46 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