1

同じモデルとコントローラーを使用する 3 つのテスト Web アプリケーションがありますが、違いは JSF セッション マネージド Bean にあります。

  • アプリケーションACは、 JSF DataModelを使用してアイテムを取得します。JPA クエリの結果セットは、ListDataModel にラップされる Java LIST を返します。この後者の値は、PrimeFaces dataTableによって表示される項目です。

  • アプリケーションBは、Java LISTを使用して項目を取得します。JPA Query の結果セットは、PrimeFaces 2.2.1 dataTable によって表示される項目の値である Java List を返します。

アプリケーション B の並べ替えとフィルタリングは完全に機能し、高速ですが、アプリケーション A と C では致命的ではありません。

Richfaces、OpenFaces などの他のライブラリの並べ替えでのフィルタリングは、この同じコードを使用してすぐに機能することを述べておきたいと思います。

問題は PrimeFaces 3.0.0 にも残っています。これはバグですか?

  • アプリ B で:

コード:

private List<Customer> items = null;
// remainder of code here
 public List<Customer> getCustomerItems() {
        if (customerItems == null) {
            getPagingInfo();
            customerItems = jpaController.findCustomerEntities(pagingInfo.getBatchSize(), pagingInfo.getFirstItem());
        }
        return customerItems;
    }

アプリ A:

コード:

private DataModel items = null;


public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(999999) {

                @Override
                public int getItemsCount() {
                    return getJpaController().getChimioCount();
                }

                @Override   // The list of Customers is wrapped in a JSF ListDataModel
                public DataModel createPageDataModel() {
                    return new ListDataModel(getJpaController().findCustomerEntities(getPageSize(), getPageFirstItem()));
                }
            };
        }
        return pagination;
    }

/**
* this goes for the value attribute in a datatable to list all the Customer items
*/
 public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

アプリ C:

コード:

private DataModel<Project> items;
// remainder of code here

/**  
*The ListDataModel is initialized here 
*/
public void init() {
        try {
            setProjectList(doInTransaction(new PersistenceAction<List<Project>>() {

                public List<Project> execute(EntityManager em) {
                    Query query = em.createNamedQuery("project.getAll");
                    return (List<Project>) query.getResultList();
                }
            }));
        } catch (ManagerException ex) {
            Logger.getLogger(ProjectManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        projectItems = new LinkedList<SelectItem>();
        projectItems.add(new SelectItem(new Project(), "-- Select one project --"));
        if (getProjectList() != null) {
            projects = new ListDataModel<Project>(getProjectList());
            for (Project p : getProjectList()) {
                projectItems.add(new SelectItem(p, p.getName()));
            }
        }
    }

よろしくお願いいたします。

4

1 に答える 1

1

これは PrimeFaces のバグである可能性があります。データ モデルが使用されている場合の DataTable の並べ替えに関する問題についての議論を見てきました。これは、トラッカーの PrimeFaces の欠陥の 1 つへのリンクです。

于 2011-06-26T11:04:47.550 に答える