0

我正在使用 JPA 命名查询来加载延迟加载的数据表。并设置 first 和 Max 结果,如下所示。

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;  
                }  
            }  

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

4

1 回答 1

1

您需要触发另一个设置总行数的查询。基本上,在LazyDataModel#load()

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

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

于 2012-08-17T12:42:21.840 回答