0

遅延ロードされた DataTable をロードするために 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;  
                }  
            }  

しかし、最初のページをロードするために必要なデータのみをロードしているため、テーブルがロードされると次へのボタンはアクティブになりません。どうすればこれを解決できますか。

4

1 に答える 1

1

合計行数を設定する別のクエリを起動する必要があります。基本的に、でLazyDataModel#load()

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

具体的な問題とは関係ありませんが、実際にQuery#setFirstResult()は最初のレコード インデックスを設定するために使用する必要があります。

于 2012-08-17T12:42:21.840 に答える